How to suppress or capture the output of subprocess.run()?
Here is how to suppress output, in order of decreasing levels of cleanliness. They assume you are on Python 3.
- You can redirect to the special
subprocess.DEVNULL
target.
import subprocesssubprocess.run(['ls', '-l'], stdout=subprocess.DEVNULL)# The above only redirects stdout...# this will also redirect stderr to /dev/null as wellsubprocess.run(['ls', '-l'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)# Alternatively, you can merge stderr and stdout streams and redirect# the one stream to /dev/nullsubprocess.run(['ls', '-l'], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
- If you want a fully manual method, can redirect to
/dev/null
by opening the file handle yourself. Everything else would be identical to method #1.
import osimport subprocesswith open(os.devnull, 'w') as devnull: subprocess.run(['ls', '-l'], stdout=devnull)
Here is how to capture output (to use later or parse), in order of decreasing levels of cleanliness. They assume you are on Python 3.
- If you simply want to capture both STDOUT and STDERR independently, AND you are on Python >= 3.7, use
capture_output=True
.
import subprocessresult = subprocess.run(['ls', '-l'], capture_output=True)print(result.stdout)print(result.stderr)
- You can use
subprocess.PIPE
to capture STDOUT and STDERR independently. This does work on Python versions < 3.7, such as Python 3.6.
import subprocessresult = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)print(result.stdout)# To also capture stderr...result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)print(result.stdout)print(result.stderr)# To mix stdout and stderr into a single stringresult = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)print(result.stdout)
NOTE: By default, captured output is returned as bytes
. If you want to capture as text (e.g. str
), use universal_newlines=True
(or on Python >=3.7, use the infinitely more clear and easy-to-understand option text=True
- it's the same as universal_newlines
but with a different name).
ex: to capture the output of ls -a
import subprocessls = subprocess.run(['ls', '-a'], capture_output=True, text=True).stdout.strip("\n")print(ls)