subprocess.check_output return code
is there a way to get a return code without a try/except?
check_output
raises an exception if it receives non-zero exit status because it frequently means that a command failed. grep
may return non-zero exit status even if there is no error -- you could use .communicate()
in this case:
from subprocess import Popen, PIPE
pattern, filename = 'test', 'tmp'
p = Popen(['grep', pattern, filename], stdin=PIPE, stdout=PIPE, stderr=PIPE,
bufsize=-1)
output, error = p.communicate()
if p.returncode == 0:
print('%r is found in %s: %r' % (pattern, filename, output))
elif p.returncode == 1:
print('%r is NOT found in %s: %r' % (pattern, filename, output))
else:
assert p.returncode > 1
print('error occurred: %r' % (error,))
You don't need to call an external command to filter lines, you could do it in pure Python:
with open('tmp') as file:
for line in file:
if 'test' in line:
print line,
If you don't need the output; you could use subprocess.call()
:
import os
from subprocess import call
try:
from subprocess import DEVNULL # Python 3
except ImportError: # Python 2
DEVNULL = open(os.devnull, 'r+b', 0)
returncode = call(['grep', 'test', 'tmp'],
stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL)
You can get the error code and results from the exception that is raised.
This can be done through the fields returncode
and output
.
For example:
import subprocess
try:
grepOut = subprocess.check_output("grep " + "test" + " tmp", shell=True)
except subprocess.CalledProcessError as grepexc:
print("error code", grepexc.returncode, grepexc.output)
To get both output and return code (without try/except) simply use subprocess.getstatusoutput (Python 3 required)
Python 3.5 introduced the subprocess.run()
method. The signature looks like:
subprocess.run(
args,
*,
stdin=None,
input=None,
stdout=None,
stderr=None,
shell=False,
timeout=None,
check=False
)
The returned result is a subprocess.CompletedProcess
. In 3.5, you can access the args
, returncode
, stdout
, and stderr
from the executed process.
Example:
>>> result = subprocess.run(['ls', '/tmp'], stdout=subprocess.DEVNULL)
>>> result.returncode
0
>>> result = subprocess.run(['ls', '/nonexistent'], stderr=subprocess.DEVNULL)
>>> result.returncode
2