问题:subprocess.Popen和os.system之间的区别
subprocess.Popen()
和之间有什么区别os.system()
?
回答 0
如果您查看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()
。
回答 1
subprocess.Popen()
是的严格超集os.system()
。
回答 2
os.system
等效于Unix system
命令,同时subprocess
创建了一个帮助程序模块,以提供Popen
命令提供的许多功能,并提供一个更容易控制的界面。它们的设计类似于Unix Popen命令。
system()
通过调用执行命令中指定的命令/bin/sh -c command
,命令完成后返回
鉴于:
该
popen()
函数通过创建管道,派生和调用外壳程序来打开进程。
如果您正在考虑使用哪一个,那么subprocess
一定要使用它,因为您具有执行的所有功能以及对该过程的额外控制。
回答 3
子是基于popen2,因此具有很多优点-有在一个完整列表在这里PEP,但有些是:
- 在外壳中使用管道
- 更好的换行支持
- 更好地处理异常
回答 4
当运行在Windows上的Python(CPython的)的<built-in function system>
使用os.system将窗帘下执行_wsystem而如果你使用非Windows操作系统,它会利用系统。
相反,Popen应该在Windows上使用CreateProcess,在基于posix的操作系统中使用_posixsubprocess.fork_exec。
就是说,重要的建议来自os.system docs,它说:
子流程模块提供了更强大的功能来生成新流程并检索其结果。使用该模块优于使用此功能。有关一些有用的食谱,请参见子过程文档中的用子过程模块替换较早的功能部分。