subprocess.Popen()和 os.system()有什么不同?
subprocess.Popen()
os.system()
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命令。
os.system
system
subprocess
Popen
system()通过调用 /bin/sh -c command执行命令中指定的命令,并在命令完成后返回
system()
/bin/sh -c command
然而:
popen()函数通过创建管道、分叉和 唤醒贝壳。
popen()
如果您正在考虑使用哪一个,那么一定要使用 subprocess,因为您拥有执行的所有工具,以及对流程的额外控制。
当在 windows 上运行 python (cpython)时,<built-in function system> 操作系统将在幕布 我们的系统下执行,而如果您使用的是非 windows 操作系统,它将使用 系统。
<built-in function system>
相反,Popen 应该在 windows 上使用 创建过程,在基于 posx 的操作系统中使用 _ posxsubprocess.fork _ exec。
也就是说,操作系统文档提供了一条重要的建议:
子流程模块为产生提供了更强大的工具 并检索它们的结果; 使用该模块是 请参阅替换旧函数 子流程文档中的子流程模块部分 一些有用的食谱。