子进程和操作系统之间的区别

subprocess.Popen()os.system()有什么不同?

155655 次浏览

Subprocess 基于 popen2,因此有很多优点-我是 PEP中有一个完整的列表,但是有一些是:

  • 在壳体中使用管道
  • 更好的换行支持
  • 更好地处理异常

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

如果你检查一下 Python 文档的 subprocess 部分,你会注意到这里有一个如何用 subprocess.Popen()代替 os.system()的例子:

sts = os.system("mycmd" + " myarg")

... 做同样的事情..。

sts = Popen("mycmd" + " myarg", shell=True).wait()

“改进的”代码看起来更复杂,但它更好,因为一旦你知道 subprocess.Popen(),你不需要其他任何东西。subprocess.Popen()取代了分散在其他三个 Python 模块中的其他几个工具(os.system()只是其中之一)。

如果有帮助的话,可以把 subprocess.Popen()想象成一个非常灵活的 os.system()

os.system相当于 Unix system命令,而 subprocess是一个辅助模块,创建它是为了提供 Popen命令提供的许多功能,并提供一个更容易和可控的界面。这些设计类似于 Unix Popen命令。

system()通过调用 /bin/sh -c command执行命令中指定的命令,并在命令完成后返回

然而:

popen()函数通过创建管道、分叉和 唤醒贝壳。

如果您正在考虑使用哪一个,那么一定要使用 subprocess,因为您拥有执行的所有工具,以及对流程的额外控制。

当在 windows 上运行 python (cpython)时,<built-in function system> 操作系统将在幕布 我们的系统下执行,而如果您使用的是非 windows 操作系统,它将使用 系统

相反,Popen 应该在 windows 上使用 创建过程,在基于 posx 的操作系统中使用 _ posxsubprocess.fork _ exec

也就是说,操作系统文档提供了一条重要的建议:

子流程模块为产生提供了更强大的工具 并检索它们的结果; 使用该模块是 请参阅替换旧函数 子流程文档中的子流程模块部分 一些有用的食谱。