Ответы:
Если вы ознакомитесь с разделом подпроцессов документации Python , вы заметите, что есть пример того, как заменить os.system()
на subprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
... делает то же самое, что и ...
sts = Popen("mycmd" + " myarg", shell=True).wait()
«Улучшенный» код выглядит более сложным, но он лучше, потому что, если вы знаете subprocess.Popen()
, вам больше ничего не нужно. subprocess.Popen()
заменяет несколько других инструментов ( os.system()
это только один из тех), которые были разбросаны по трем другим модулям Python.
Если это поможет, считайте, что subprocess.Popen()
это очень гибкий os.system()
.
shell=True
если вы можете. Наличие этой опции - одно из преимуществ subprocess.Popen()
и вспомогательных функций.
os.system
и subprocess.call/popen/run
блокируют / ждут завершения команды: stackoverflow.com/a/14059648/4752883
os.system
эквивалентен system
команде Unix , а subprocess
был вспомогательным модулем, созданным для обеспечения многих возможностей, предоставляемых Popen
командами, с более простым и управляемым интерфейсом. Они были разработаны аналогично команде Unix Popen .
system()
выполняет команду, указанную в command, путем вызова/bin/sh -c command
и возвращается после завершения команды
В то время как:
popen()
Функция открывает процесс создания канала, разветвление, и вызова оболочки.
Если вы думаете, какой из них использовать, subprocess
определенно используйте, потому что у вас есть все возможности для выполнения, а также дополнительный контроль над процессом.
Подпроцесс основан на popen2 и, как таковой, имеет ряд преимуществ - здесь есть полный список в PEP , но некоторые из них:
При запуске python (cpython) в Windows система <built-in function system>
os.system будет выполняться под занавесками _wsystem, а если вы используете ОС, отличную от Windows, она будет использовать system .
Напротив, Popen должен использовать CreateProcess в Windows и _posixsubprocess.fork_exec в операционных системах на основе posix.
Тем не менее, важный совет исходит из документации os.system , в которой говорится:
Модуль подпроцесса предоставляет более мощные средства для создания новых процессов и получения их результатов; использование этого модуля предпочтительнее, чем использование этой функции. См. Раздел «Замена старых функций модулем подпроцесса» в документации по подпроцессам, где приведены некоторые полезные рецепты.
sts = p.wait()
вместо последней строки.