Как выполнить скрипт оболочки через python

У меня есть скрипт, скажем, abc.sh, в котором есть список команд с флагами. пример

//abc.sh
echo $FLAG_name
cp   $FLAG_file1   $FLAG_file2
echo 'file copied'

Я хочу выполнить этот скрипт через код Python. сказать

//xyz.py

name = 'FUnCOder'
filename1  = 'aaa.txt'
filename2 = 'bbb.txt'

subprocess.call([abc.sh, name, filename1, filname2], stdout=PIPE, stderr=PIPE, shell=True)

Этот звонок не работает.

Какие есть другие варианты?

Также файл сценария оболочки находится в каком-то другом каталоге. И я хочу, чтобы вывод шел в логах.

4 ответа

Обычно вы хотите использовать Popen так как у вас есть управление процессом впоследствии. Пытаться:

process = subprocess.Popen(['abc.sh', name, filename1, filname2], stdout=PIPE, stderr=PIPE)
process.wait() # Wait for process to complete.

# iterate on the stdout line by line
for line in process.stdout.readlines():
    print(line)

Попробуй это:

//xyz.py

name = 'FUnCOder'
filename1  = 'aaa.txt'
filename2 = 'bbb.txt'

process = subprocess.Popen(['abc.sh', name, filename1, filname2], stdout=PIPE)
process.wait()

Обратите внимание, что abc.sh в кавычках, потому что это не имя переменной, а команда, которую вы вызываете.

Я также, в общем, рекомендую использовать shell=Falseхотя в некоторых случаях необходимо использовать shell=True,

Чтобы поместить вывод в файл, попробуйте:

with open("logfile.log") as file:
    file.writelines(process.stdout)

Я знаю, что это старый вопрос, ниже приведен способ, если вы используете версии Python 3.5 и выше.

import subprocess
process = subprocess.run('script.sh', shell=True, check=True, timeout=10) 

Ссылка: https://docs.python.org/3.5/library/subprocess.html

Я на macOS и для запуска сценария оболочки я использовал:

process = subprocess.Popen([abc.sh, name, filename1, filname2], shell=True)

Другие вопросы по тегам