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.system
和subprocess.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 和 os.system 的区别
subprocess.call() 和 subprocess.Popen() 之间有啥区别使 PIPE 对前者的安全性降低?
subprocess.call() 和 subprocess.Popen() 之间有啥区别使 PIPE 对前者的安全性降低?