“subprocess.Popen” - checking for success and errors

前端 未结 5 2127
迷失自我
迷失自我 2020-11-30 07:29

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 i

相关标签:
5条回答
  • 2020-11-30 07:45

    You can check return code of the process using check_call() method. In case if process returned non-zero value CalledProcessError will be raised.

    0 讨论(0)
  • 2020-11-30 07:45
          output,error=pipe.communicate()
    

    This will wait for command to finish and give you output or error depending on the state of command.

    0 讨论(0)
  • 2020-11-30 07:53

    This is how I did it finally:

        # Call a system process
        try:
            # universal_newlines - makes manual decoding of subprocess.stdout unnecessary
            output = subprocess.check_output(command,
                                             stderr=subprocess.STDOUT,
                                             universal_newlines=True)
    
            # Print out command's standard output (elegant)
            self.textEdit_CommandLineOutput.insertPlainText(output)
            self.isCommandExecutionSuccessful = True
    
        except subprocess.CalledProcessError as error:
            self.isCommandExecutionSuccessful = False
    
            errorMessage = ">>> Error while executing:\n"\
                           + command\
                           + "\n>>> Returned with error:\n"\
                           + str(error.output)
            self.textEdit_CommandLineOutput.append(errorMessage)
    
            QMessageBox.critical(None,
                                 "ERROR",
                                 errorMessage)
            print("Error: " + errorMessage)
    
        except FileNotFoundError as error:
            errorMessage = error.strerror
            QMessageBox.critical(None,
                                 "ERROR",
                                 errorMessage)
            print("Error: ", errorMessage)
    

    I hope it will be useful to someone else.

    0 讨论(0)
  • 2020-11-30 08:04

    Complete solution with check on return code, stdout and stderr:

    import subprocess as sp
    
    # ok
    pipe = sp.Popen( 'ls /bin', shell=True, stdout=sp.PIPE, stderr=sp.PIPE )
    # res = tuple (stdout, stderr)
    res = pipe.communicate()
    print("retcode =", pipe.returncode)
    print("res =", res)
    print("stderr =", res[1])
    for line in res[0].decode(encoding='utf-8').split('\n'):
      print(line)
    
    # with error
    pipe = sp.Popen( 'ls /bing', shell=True, stdout=sp.PIPE, stderr=sp.PIPE )
    res = pipe.communicate()
    print("retcode =", pipe.returncode)
    print("res =", res)
    print("stderr =", res[1])
    

    Prints:

    retcode = 0
    res = (b'bash\nbunzip2\nbusybox\nbzcat\n...zmore\nznew\n', b'')
    stderr = b''
    bash
    bunzip2
    busybox
    bzcat
    ...
    zmore
    znew
    
    retcode = 2
    res = (b'', b"ls: cannot access '/bing': No such file or directory\n")
    stderr = b"ls: cannot access '/bing': No such file or directory\n"
    
    0 讨论(0)
  • 2020-11-30 08:08

    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

    0 讨论(0)
提交回复
热议问题