subprocess:意外关键字参数capture_output

Tij*_*ijs 37 python subprocess

当执行Python文档中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'
Run Code Online (Sandbox Code Playgroud)

我正在运行Python 3.6.6:

$ python3 --version
Python 3.6.6
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 66

你检查错误的文档中,这个参数并不会存在,因为可以在中找到文件(您选择左上角的版本):

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)
Run Code Online (Sandbox Code Playgroud)

但是,你可以通过设置stdoutstderr来轻松地"模拟"这个PIPE:

from subprocess import PIPE

subprocess.run(["ls", "-l", "/dev/null"], stdout=PIPE, stderr=PIPE)
Run Code Online (Sandbox Code Playgroud)

实际上,如果我们查看版本的源代码,其中介绍了该功能,我们在源代码[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
Run Code Online (Sandbox Code Playgroud)

  • 您也可以仅使用“stdout=subprocess.PIPE”来达到相同的效果,而无需导入 (3认同)
  • @ScottF:您确实导入了“from subprocess import PIPE”(正如您在代码片段顶部看到的那样)? (2认同)

Hug*_*ohm 6

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

import subprocess
subprocess.check_output(["ls", "-l", "/dev/null"])
Run Code Online (Sandbox Code Playgroud)