Ответы:
Если вы ознакомитесь с разделом подпроцессов документации 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()вместо последней строки.