95

When executing subprocess.run() as given in the Python docs, I get a 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'

I am running Python 3.6.6:

$ python3 --version
Python 3.6.6
Tijs
  • 1,257
  • 1
  • 8
  • 13

3 Answers3

171

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
Nordle
  • 2,915
  • 3
  • 16
  • 34
Willem Van Onsem
  • 443,496
  • 30
  • 428
  • 555
8

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

import subprocess
subprocess.check_output(["ls", "-l", "/dev/null"])
Hugo Sohm
  • 2,872
  • 4
  • 23
  • 40
3

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

Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103