Answers:
如果您查看Python文档的subprocess部分,您会注意到有一个示例如何替换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()
。
shell=True
如果可以的话,应该避免使用。拥有此选项是的好处之一,subprocess.Popen()
并且是其辅助功能。
os.system
并subprocess.call/popen/run
确实块/等待命令完成:stackoverflow.com/a/14059648/4752883
os.system
等效于Unix system
命令,同时subprocess
创建了一个帮助程序模块,以提供Popen
命令提供的许多功能,并提供一个更容易控制的界面。它们的设计类似于Unix Popen命令。
system()
通过调用执行命令中指定的命令/bin/sh -c command
,命令完成后返回
鉴于:
该
popen()
函数通过创建管道,派生和调用外壳程序来打开进程。
如果您正在考虑使用哪一个,那么subprocess
一定要使用它,因为您具有执行的所有功能以及对该过程的额外控制。
子是基于popen2,因此具有很多优点-有在一个完整列表在这里PEP,但有些是:
当运行在Windows上的Python(CPython的)的<built-in function system>
使用os.system将窗帘下执行_wsystem而如果你使用非Windows操作系统,它会利用系统。
相反,Popen应该在Windows上使用CreateProcess,在基于posix的操作系统中使用_posixsubprocess.fork_exec。
就是说,重要的建议来自os.system docs,它说:
子流程模块提供了更强大的功能来生成新流程并检索其结果。使用该模块优于使用此功能。有关一些有用的食谱,请参见子过程文档中的用子过程模块替换较早的功能部分。
sts = p.wait()
而不是最后一行。