【问题标题】:What is the difference between suprocess.run(['ls', '-la'], capture_output=True).stdout and suprocess.check_output(['ls', '-la'])?subprocess.run(['ls', '-la'], capture_output=True).stdout 和 subprocess.check_output(['ls', '-la']) 有什么区别?
【发布时间】:2021-01-26 03:21:00
【问题描述】:

我是 Python 的初学者,我似乎找不到以下两者之间的区别,

import subprocess

test1 = subprocess.run(['ls', '-la'], capture_output=True)
print(test1.stdout)

test2 = subprocess.check_output(['ls', '-la'])
print(test2)

我发现 test1test2 给了我同样的东西。有什么区别?

还有两个我在谷歌上不明白的术语是 'Popen constructor''pipe'。如果您也能详细说明这两者以及它们与子流程模块的关系,将会很有帮助。

【问题讨论】:

  • Python 的subprocess 模块提供了具有不同抽象级别的函数。 check_output 是一种比更通用的 run 函数检查输出的高级且特定的方法。来自docscheck_output 等价于:run(..., check=True, stdout=PIPE).stdout ... 完整的函数签名与run() 的签名大致相同 - 大多数参数直接通过到那个接口,所以本质上它是一个方便的包装器,用于简化较低抽象层中的常见任务。

标签: python-3.x subprocess pipe stdout popen


【解决方案1】:

capture_output 参数传递给subprocess.run 是Python 3.7 中的新功能。

subprocess.check_output 是旧的高级 API (docs)

在 Python 3.5 之前,这三个函数构成了 subprocess 的高级 API。您现在可以在很多情况下使用run(),但是很多现有代码都会调用这些函数。

保留旧 API 是为了向后兼容 - 删除它们几乎没有什么好处,并且需要较长的弃用期以避免破坏现有代码。

Popen ("process open") 是较低级别的 API,将由 runcheck_output 等在内部使用。“Popen 构造函数”记录在 here

子进程pipe只是子进程API对底层操作系统提供的进程间通信特性的抽象。例如,使用 shell ls -la | grep needle 将使用管道 |ls 的标准输出连接到 grep 的标准输入。要在子进程 API 中执行类似操作,您可以在生成子进程时将特殊值 subprocess.PIPE 作为标准输出句柄传递。您可能会将管道视为一个小型 FIFO 缓冲区,它将一个进程的输出引导到另一个进程的输入。

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2015-01-05
    • 1970-01-01
    • 2012-08-27
    相关资源
    最近更新 更多