Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get exit code and stderr from subprocess call

I read up on the functions provided by subprocess - call, check_call, check_output, and understand how each works and differs in functionality from one another. I am currently using check_output, so I can have access to the stdout, and used "try block" to catch the exception, as follows:

# "cmnd" is a string that contains the command along with it's arguments.  try:     cmnd_output = check_output(cmnd, stderr=STDOUT, shell=True, timeout=3, universal_newlines=True);                          except CalledProcessError:                                                                                                        print("Status : FAIL")                                                                                                    print("Output: \n{}\n".format(cmnd_output))                                                                                   

The issue I am running into is when an exception is thrown, "cmnd_output" is not initialized and don't have access to stderr, and I get the following error message:

print("Output: \n{}\n".format(cmnd_output)) UnboundLocalError: local variable 'cmnd_output' referenced before assignment 

I think thats because the exception causes the "check_output" to bail immediately without any further processing, aka assignment to "cmnd_output", in the try block. Please correct me if I am wrong.

Is there any way I can get access to stderr (it's ok if it's sent to stout) and have access to the exit code. I can manually check for pass/fail based on exit code with out the exception being throuwn.

Thank you, Ahmed.

like image 683
Ahmed A Avatar asked Apr 24 '13 17:04

Ahmed A


People also ask

How do you get stdout and stderr from subprocess run?

To capture the output of the subprocess. run method, use an additional argument named “capture_output=True”. You can individually access stdout and stderr values by using “output. stdout” and “output.

How do I get the output of a subprocess call?

communicate() #Another way to get output #output = subprocess. Popen(args,stdout = subprocess. PIPE). stdout ber = raw_input("search complete, display results?") print output #... and on to the selection process ...


1 Answers

Try this version:

import subprocess try:     output = subprocess.check_output(         cmnd, stderr=subprocess.STDOUT, shell=True, timeout=3,         universal_newlines=True) except subprocess.CalledProcessError as exc:     print("Status : FAIL", exc.returncode, exc.output) else:     print("Output: \n{}\n".format(output)) 

This way you will print the output only if the call was successful. In case of a CalledProcessError you print the return code and the output.

like image 78
warvariuc Avatar answered Oct 21 '22 02:10

warvariuc