I want to check if a subprocess has finished execution successfully or failed. Currently I have come up with a solution but I am not sure if it is correct and reliable. Is it guaranteed that every process outputs its errors only to stderr respectfully to stdout: Note: I am not interested in just redirecting/printing out the output. That I know already how to do.
pipe = subprocess.Popen(command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True)
if "" == pipe.stdout.readline():
print("Success")
self.isCommandExectutionSuccessful = True
if not "" == pipe.stderr.readline():
print("Error")
self.isCommandExectutionSuccessful = True
alternatively:
if "" == pipe.stdout.readline():
print("Success")
self.isCommandExectutionSuccessful = True
else:
print("Error")
self.isCommandExectutionSuccessful = False
and:
if not "" == pipe.stderr.readline():
print("Success")
self.isCommandExectutionSuccessful = True
else:
print("Error")
self.isCommandExectutionSuccessful = False
Complete solution with check on return code, stdout and stderr:
Prints:
This will wait for command to finish and give you output or error depending on the state of command.
You can check return code of the process using check_call() method. In case if process returned non-zero value CalledProcessError will be raised.
This is how I did it finally:
I hope it will be useful to someone else.
Do you need to do anything with the output of the process?
The
check_call
method might be useful here. See the python docs here: https://docs.python.org/2/library/subprocess.html#subprocess.check_callYou can then use this as follows:
However, this relies on
command
returning an exit code of 0 for succesful completion and a non-zero value for an error.If you need to capture the output as well, then the
check_output
method may be more appropriate. It is still possible to redirect the standard error if you need this as well.See the docs here: https://docs.python.org/2/library/subprocess.html#subprocess.check_output