Subprocess: 意外的关键字参数 catch_output

当执行 巨蟒文件中给出的 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
57904 次浏览

You inspected the wrong documentation, for this parameter does not exist, as can be found in the documentation (you select the version at the top left):

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)

You can however easily "emulate" this by setting both stdout and stderr to PIPE:

from subprocess import PIPE


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

In fact, if we look at the source code of the version, where the feature was introduced, we see in the 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

I ran into this error because I was calling subprocess.call (which is the old high level API) instead of subprocess.run.

The simplest method is to use the subprocess.check_output function:

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