【发布时间】:2011-06-16 08:12:02
【问题描述】:
subprocess.Popen() 和 os.system() 有什么区别?
【问题讨论】:
标签: python subprocess system
subprocess.Popen() 和 os.system() 有什么区别?
【问题讨论】:
标签: python subprocess system
Subprocess 基于 popen2,因此具有许多优点 - PEP here 中有完整列表,但有些是:
【讨论】:
subprocess.Popen() 是os.system() 的严格超集。
【讨论】:
os.system 缺少什么,或者为什么你可能需要Popen。
如果您查看subprocess section of the Python docs,您会注意到有一个如何将os.system() 替换为subprocess.Popen() 的示例:
sts = os.system("mycmd" + " myarg")
...和...做同样的事情
sts = Popen("mycmd" + " myarg", shell=True).wait()
“改进”的代码看起来更复杂,但更好,因为一旦你知道subprocess.Popen(),你就不需要其他任何东西了。 subprocess.Popen() 替换了分散在其他三个 Python 模块中的其他几个工具(os.system() 只是其中之一)。
如果有帮助,请将subprocess.Popen() 视为非常灵活的os.system()。
【讨论】:
sts = p.wait()代替最后一行。
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执行command中指定的命令,并在命令完成后返回
鉴于:
popen()函数通过创建管道、分叉和 调用 shell。
如果您正在考虑使用哪一个,那么请务必使用 subprocess,因为您拥有所有执行工具,以及对流程的额外控制。
【讨论】:
在 windows 上运行 python (cpython) 时,<built-in function system> os.system 将在窗帘下执行 _wsystem 而如果您使用的是非 windows 操作系统,它将使用 system。
相反,Popen 应该在 Windows 上使用 CreateProcess,在基于 posix 的操作系统中使用 _posixsubprocess.fork_exec。
也就是说,来自os.system docs 的一条重要建议是:
子进程模块为生成提供了更强大的工具 新流程并检索其结果;使用该模块是 最好使用此功能。请参阅替换旧函数 使用子流程文档中的子流程模块部分 一些有用的食谱。
【讨论】: