Разница между подпроцессом. Открыть и os.system - PullRequest
91 голосов
/ 27 января 2011

В чем разница между subprocess.Popen() и os.system()?

Ответы [ 5 ]

81 голосов
/ 27 января 2011

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

37 голосов
/ 27 января 2011

subprocess.Popen() это строгий супер-набор os.system().

21 голосов
/ 27 января 2011

os.system эквивалентна команде Unix system , в то время как подпроцесс был вспомогательным модулем, созданным для обеспечения многих возможностей, предоставляемых командами Popen, более простым и управляемым интерфейсом. Они были разработаны аналогично команде Unix Popen .

system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed

где как

The popen() function opens a process by creating a pipe, forking, and invoking the shell.

Если вы думаете, какой из них использовать, то используйте подпроцесс определенно, потому что у вас есть все возможности для выполнения, плюс дополнительный контроль над процессом.

20 голосов
/ 27 января 2011

Подпроцесс основан на popen2, и поэтому имеет ряд преимуществ - здесь есть полный список PEP , но некоторые из них:

  • с использованием трубы в оболочке
  • улучшенная поддержка новой строки
  • улучшенная обработка исключений
2 голосов
/ 09 марта 2018

При запуске python (cpython) в Windows <built-in function system> os.system будет выполняться под занавесом _wsystem , а если вы используете ОС не из Windows, будем использовать систему .

Напротив, Popen должен использовать CreateProcess в Windows и _posixsubprocess.fork_exec в операционных системах на основе posix.

Тем не менее, важный совет приходит от os.system docs, которая гласит:

Модуль подпроцесса предоставляет более мощные средства для нереста новые процессы и извлечение их результатов; используя этот модуль предпочтительнее использовать эту функцию. См. Замена старых функций с разделом Модуль подпроцесса в документации подпроцесса для некоторые полезные рецепты.

...