Я хочу вызвать внешнюю программу из Python. Я использовал и то, Popen()
и другое call()
.
В чем разница между двумя?
Моя конкретная цель - запустить следующую команду из Python. Я не уверен, как перенаправления работают.
./my_script.sh > output
Я прочитал документацию и там написано, что call()
это удобная функция или функция быстрого доступа. Мы теряем какую-то власть, используя call()
вместо Popen()
?
python
subprocess
popen
varunl
источник
источник
call()
кажется очень ясным. Можете ли вы предоставить цитату или ссылку, чтобы мы знали, на что обратить внимание в ответе?Ответы:
Есть два способа сделать перенаправление. Оба относятся к любому
subprocess.Popen
илиsubprocess.call
.Установите ключевое слово аргумент
shell = True
илиexecutable = /path/to/the/shell
и укажите команду так, как она у вас есть.Поскольку вы просто перенаправляете вывод в файл, установите аргумент ключевого слова
где объект указывает на
output
файл.subprocess.Popen
является более общим, чемsubprocess.call
.Popen
не блокирует, позволяя вам взаимодействовать с процессом во время его работы или продолжать заниматься другими вещами в вашей программе на Python. ВызовPopen
возвращаетPopen
объект.call
делает блок. Несмотря на то, что он поддерживает все те же аргументы, что иPopen
конструктор, вы все равно можете установить выходные данные процесса, переменные среды и т. Д., Но ваш сценарий ожидает завершения программы иcall
возвращает код, представляющий состояние выхода процесса.в основном то же самое, что звонить
call
это просто удобная функция. Его реализация в CPython находится в subprocess.py :Как видите, вокруг него тонкая обертка
Popen
.источник
Другой ответ очень полный, но вот практическое правило:
call
блокирует:Popen
не блокирует:источник