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()而不是最后一行。