【问题标题】:subprocess: unexpected keyword argument capture_output子进程:意外的关键字参数 capture_output
【发布时间】:2019-04-12 01:02:36
【问题描述】:

在执行Python docs 中给出的subprocess.run() 时,我得到一个TypeError:

>>> import subprocess
>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/subprocess.py", line 403, in run
    with Popen(*popenargs, **kwargs) as process:
TypeError: __init__() got an unexpected keyword argument 'capture_output'

我正在运行 Python 3.6.6:

$ python3 --version
Python 3.6.6

【问题讨论】:

  • capture_output 是 Python 3.7 中的新功能。

标签: python subprocess


【解决方案1】:

你检查了错误的文档,对于,这个参数确实存在,可以在documentation中找到(你选择左上角的版本):

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None,
               shell=False, cwd=None, timeout=None, check=False, encoding=None,
               errors=None, env=None)

但是,您可以通过将 stdoutstderr 都设置为 PIPE 来轻松“模拟”它:

from subprocess import PIPE

subprocess.run(["ls", "-l", "/dev/null"], stdout=PIPE, stderr=PIPE)

其实,如果我们查看版本的源码,我们在source code [GitHub]中看到了引入该功能的地方:

if capture_output:
    if ('stdout' in kwargs) or ('stderr' in kwargs):
        raise ValueError('stdout and stderr arguments may not be used '
                         'with capture_output.')
    kwargs['stdout'] = PIPE
    kwargs['stderr'] = PIPE

【讨论】:

  • 如果我尝试使用此处提供的解决方案,我会收到“名称 'PIPE' 未定义”。
  • @ScottF:你确实导入了它from subprocess import PIPE(正如你在代码片段顶部看到的那样)?
  • 你也可以使用stdout=subprocess.PIPE 来达到同样的效果而不需要导入
【解决方案2】:

我遇到了这个错误,因为我调用的是 subprocess.call(这是旧的高级 API)而不是 subprocess.run

【讨论】:

    【解决方案3】:

    最简单的方法是使用subprocess.check_output函数:

    import subprocess
    subprocess.check_output(["ls", "-l", "/dev/null"])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 2021-04-24
      • 2016-11-12
      • 2020-09-12
      • 2017-06-29
      相关资源
      最近更新 更多