Here's the Python code to run an arbitrary command returning its
proc = subprocess.Popen(
stderr=subprocess.STDOUT, # Merge stdout and stderr
stdoutdata, stderrdata = proc.communicate()
In Python 3.3+:
from subprocess import STDOUT, check_output output = check_output(cmd, stderr=STDOUT, timeout=seconds)
output is a byte string that contains command's merged stdout, stderr data.
This code raises
CalledProcessError on non-zero exit status as specified in the question's text unlike
shell=True because it is often used unnecessarily. You can always add it back if
cmd indeed requires it. If you add
shell=True i.e., if the child process spawns its own descendants;
check_output() can return much later than the timeout indicates, see Subprocess timeout failure.
The timeout feature is available on Python 2.x via the
subprocess32 backport of the 3.2+ subprocess module.