[英]Difference between subprocess.Popen and os.system
是什么区别subprocess.Popen()
和os.system()
如果您查看Python 文档的os.system()
部分,您会注意到有一个示例说明如何将os.system()
替换为os.system()
subprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
......和......做同样的事情
sts = Popen("mycmd" + " myarg", shell=True).wait()
“改进后的”代码看起来更复杂,但它更好,因为一旦您知道subprocess.Popen()
,您就不需要其他任何东西了。 os.system()
subprocess.Popen()
替换了分散在其他三个 Python 模块中的其他几个工具( os.system()
只是其中之一)。
如果有帮助,想subprocess.Popen()
作为一个非常灵活的os.system()
subprocess.Popen()
是严格的超集的os.system()
os.system
相当于Unix的system
命令,而subprocess
是为了提供许多的由所提供的设施的辅助模块Popen
命令与一个更简单的和可控制的接口。 这些设计类似于Unix Popen命令。
system()
通过调用/bin/sh -c command
执行 command 中指定的/bin/sh -c command
,并在命令完成后返回
鉴于:
popen()
函数通过创建管道、分叉和调用 shell 来打开一个进程。
如果您正在考虑使用哪一个,那么绝对使用subprocess
因为您拥有所有执行设施,以及对流程的额外控制。
子进程基于 popen2,因此具有许多优点 - 此处的PEP 中有完整列表,但有些是:
在 Windows 上运行 python (cpython) 时, <built-in function system>
os.system将在_wsystem 幕布下执行,而如果您使用的是非 Windows 操作系统,它将使用system 。
相反,Popen 应该在 windows 上使用CreateProcess ,在基于 posix 的操作系统中使用_posixsubprocess.fork_exec 。
也就是说,一条重要的建议来自os.system docs,它说:
subprocess 模块提供了更强大的工具来生成新进程并检索它们的结果; 使用该模块比使用此功能更可取。 有关一些有用的秘诀,请参阅子流程文档中的用子流程模块替换旧函数部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.