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

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

【问题讨论】:

    标签: python subprocess 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 抓取脚本,其中哪一个可以让我完成抓取脚本,然后才执行下一行代码?例如,我的抓取应该在执行可以继续之前完成。
      • 也许还提到stackoverflow.com/questions/3172470/… 以指出您应该尽可能避免使用shell=True。拥有此选项是 subprocess.Popen() 及其辅助函数的优势之一。
      • @PrakharMohanSrivastava 如果您想阻止流程并等待命令完成其工作,请查看:stackoverflow.com/a/2837319/5252192
      • @PrakharMohanSrivastava,通常os.systemsubprocess.call/popen/run 都会阻止/等待命令完成:stackoverflow.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 的一条重要建议是:

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

      【讨论】:

        猜你喜欢
        • 2013-03-09
        • 2016-10-04
        • 2015-05-20
        • 2020-04-25
        • 1970-01-01
        • 2018-04-30
        • 2018-09-12
        • 2017-01-04
        • 1970-01-01
        相关资源
        最近更新 更多