Статья

Как запустить приложение или вызвать системную команду в Python?

Перечислим основные способы вызова внешних программ в Питоне, включая их преимущества и недостатки.

os.system

Вызов os.system принимает команду и аргументы в shell-оболочку вашей операционной системы. Таким образом можно запускать несколько команд одновременно, настраивать каналы и перенаправление ввода/вывода. Приведем пример:
os.system("first_command < input_file | second_command > output_file")  
Однако, хотя это очень удобно, вам придется вручную выполнять экранирование служебных символов в переданной строке. С другой стороны, с помощью os.system можно запускать команды, которые являются командами shell, а не только внешние приложения.

os.popen

Вызов os.popen делает то же самое, что и os.system, за исключением того, что он предоставляет вам файлоподобный объект, который вы можете использовать для доступа к стандартному вводу/выводу для этого процесса. Есть 3 разных варианта popen, которые обрабатывают ввод-вывод немного по-разному. Пример:
print(os.popen("ls -l").read())

subprocess.Popen

Класс subprocess.Popen используется в качестве замены os.popen, но имеет недостаток в том, что он немного сложнее в силу своей полноты. Пример:
print subprocess.Popen("echo Hello", shell=True, stdout=subprocess.PIPE).stdout.read()

что аналогично:
print os.popen("echo Hello").read()
Но удобно иметь все опции в одном унифицированном классе вместо 4-х разных функций popen.

subprocess.call

subprocess.call Используется в основном так же, как класс Popen, и принимает все те же аргументы, но он просто ожидает завершения команды и выдает код возврата. Пример:
code = subprocess.call("echo Hello", shell=True)

subprocess.run

subprocess.runДоступен только в Python 3.5+. Он аналогичен приведенному выше коду, но более гибкий и возвращает объект CompletedProcess, когда команда завершает выполнение.
os.fork, os.exec, os.spawn похожи на их аналоги на языке Си, но мы не рекомендуем использовать их напрямую.
2019-01-04 01:35 python