subprocess.Popen和os.system之间的区别

时间:2011-01-27 06:04:09

标签: python subprocess system

subprocess.Popen()os.system()之间的区别是什么?

5 个答案:

答案 0 :(得分:79)

如果您查看了subprocess section of the Python docs,就会发现有一个示例说明如何将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()

答案 1 :(得分:37)

subprocess.Popen()os.system()的严格超集。

答案 2 :(得分:20)

子流程基于popen2,因此有许多优点 - PEP here中有一个完整的列表,但有些是:

  • 在shell中使用管道
  • 更好的换行支持
  • 更好地处理例外

答案 3 :(得分:20)

os.system等同于Unix system命令,而subprocess是一个辅助模块,用于提供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.

如果您正在考虑使用哪一个,那么请使用子流程,因为您拥有所有执行工具,并且可以对该流程进行额外控制。

答案 4 :(得分:2)

在Windows上运行python(cpython)时,foreach (var d in digits) binaryList.Add(int.Parse(d)); os.system将在窗帘_wsystem下执行,而如果您使用的是非Windows操作系统,它将使用{{ 3}}

相反,Popen应该在Windows上使用system,在基于posix的操作系统中使用CreateProcess

也就是说,一个重要的建议来自_posixsubprocess.fork_exec文档,其中说:

  

子进程模块为产卵提供了更强大的功能   新流程并检索其结果;使用该模块是   比使用这个功能更好。请参阅更换旧功能   使用子流程文档中的子流程模块部分   一些有用的食谱。