Как выполнить скрипт оболочки через 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)
Я на macOS и для запуска сценария оболочки я использовал:
process = subprocess.Popen([abc.sh, name, filename1, filname2], shell=True)