"subprocess.Popen" - checking for success and errors

python, python-3.x, stderr, stdout, subprocess

Solution

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_call

You can then use this as follows:

try:
  subprocess.check_call(command)
except subprocess.CalledProcessError:
  # There was an error - command exited with non-zero code

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.

try:
  proc = subprocess.check_output(command, stderr=subprocess.STDOUT)
  # do something with output
except subprocess.CalledProcessError:
  # There was an error - command exited with non-zero code

See the docs here: https://docs.python.org/2/library/subprocess.html#subprocess.check_output

Problem

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 ```

Original source

Related problems