subprocess.Popen 和 os.system 的区别

Posted

技术标签:

【中文标题】subprocess.Popen 和 os.system 的区别【英文标题】:Difference between subprocess.Popen and os.system 【发布时间】:2011-06-16 08:12:02 【问题描述】:

subprocess.Popen()os.system() 有什么区别?

【问题讨论】:

【参考方案1】:

Subprocess 基于 popen2,因此具有许多优点 - PEP here 中有完整列表,但有些是:

在 shell 中使用管道 更好的换行支持 更好地处理异常

【讨论】:

【参考方案2】:

subprocess.Popen()os.system() 的严格超集。

【讨论】:

这是完整的优雅答案。 它很优雅,但并不完整,因为它没有描述os.system 缺少什么,或者为什么你可能需要Popen【参考方案3】:

如果您查看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()代替最后一行。 @JacobMarble 所以假设我正在从另一个 python 脚本调用 selenium 抓取脚本,其中哪一个可以让我完成抓取脚本,然后才执行下一行代码?例如,我的抓取应该在执行可以继续之前完成。 也许还提到***.com/questions/3172470/… 以指出您应该尽可能避免使用shell=True。拥有此选项是 subprocess.Popen() 及其辅助函数的优势之一。 @PrakharMohanSrivastava 如果您想阻止流程并等待命令完成其工作,请查看:***.com/a/2837319/5252192 @PrakharMohanSrivastava,通常os.systemsubprocess.call/popen/run 都会阻止/等待命令完成:***.com/a/14059648/4752883【参考方案4】:

os.system 等效于 Unix 的 system 命令,而 subprocess 是一个帮助模块,旨在为 Popen 命令提供的许多功能提供更简单和可控的界面。它们的设计类似于Unix Popen 命令。

system()通过调用/bin/sh -c command执行command中指定的命令,并在命令完成后返回

鉴于:

popen() 函数通过创建管道、分叉和 调用 shell。

如果您正在考虑使用哪一个,那么请务必使用 subprocess,因为您拥有所有执行工具,以及对流程的额外控制。

【讨论】:

好的..那么有什么方法可以在 windows env 中同时执行 os.system 和 popen 吗?我是新手,需要深入挖掘.. 是的,您可以在 Windows 环境中同时使用 os.system 和 subprocess。查看来自 effbot.org(Python 标准库在线书籍)的基本教程【参考方案5】:

在 windows 上运行 python (cpython) 时,<built-in function system> os.system 将在窗帘下执行 _wsystem 而如果您使用的是非 windows 操作系统,它将使用 system。

相反,Popen 应该在 Windows 上使用 CreateProcess,在基于 posix 的操作系统中使用 _posixsubprocess.fork_exec。

也就是说,来自os.system docs 的一条重要建议是:

子进程模块为生成提供了更强大的工具 新流程并检索其结果;使用该模块是 最好使用此功能。请参阅替换旧函数 使用子流程文档中的子流程模块部分 一些有用的食谱。

【讨论】:

以上是关于subprocess.Popen 和 os.system 的区别的主要内容,如果未能解决你的问题,请参考以下文章

subprocess.call和subprocess.Popen

实时 subprocess.Popen 通过 stdout 和 PIPE

subprocess的popen函数

subprocess.Popen 和 os.system 的区别

subprocess.call() 和 subprocess.Popen() 之间有啥区别使 PIPE 对前者的安全性降低?

subprocess.call() 和 subprocess.Popen() 之间有啥区别使 PIPE 对前者的安全性降低?