Comprobando el estado del proceso con subproceso. Abrir en Python

Si invoco un proceso con subprocess.Popen en Python de la siguiente manera:

myproc = subprocess.Popen(...).communicate()

¿Cuál es la forma correcta de ver su estado? ¿No es su salida a stdout o stderr, pero su estado de salida una vez que se termina (por ejemplo, 0 para el éxito u otro para el fracaso)?

returncode es de hecho la respuesta, pero la solución no necesita ser complicada.

 process = subprocess.Popen(...) stdoutdata, stderrdata = process.communicate() print process.returncode 

Más información en los documentos de subprocess Python .

Un proceso no tiene un código de retorno hasta que se termina de ejecutar. Por lo tanto, si aún no ha terminado, debe decidir qué desea hacer: espere o devuelva algún indicador de “Aún no he terminado”.

Si desea esperar, utilice communicate y luego verifique el atributo de returncode .

Si desea verificar si el código de retorno está establecido, y devolver None si no lo está, use Popen.poll() .

Popen.poll ()

Compruebe si el proceso hijo ha finalizado. Establecer y devolver el atributo de código de retorno.

(si el proceso no ha finalizado, poll() devuelve None )

Es posible que tenga que llamar a una wait en su subproceso y luego (una vez que haya terminado) verifique el estado en el campo de returncode de returncode de la instancia de subproceso.

Tengo una pequeña rutina que llama cosas, tal vez ayude …

 def singleProcessExecuter(command, ** kwargs): assert isinstance(command, list), "Expected 'command' parameter to be a list containing the process/arguments to execute. Got %s of type %s instead" % (command, type(command)) assert len(command) > 0, "Received empty list of parameters" retval = { "exitCode": -1, "stderr": u"", "stdout": u"", "execTime": datetime.timedelta(0), "command": None, "pid": None } retval["command"] = command log.info("::singleProcessExecuter > At %s, executing \"%s\"" % (datetime.datetime.now(), " ".join(command))) #print("::singleProcessExecuter > At %s, executing \"%s\"" % (datetime.datetime.now(), " ".join(parameter))) cwd = kwargs.get("cwd", os.getcwd()) user = kwargs.get("user", getUid()) sheel = kwargs.get("shell", False) startDatetime = datetime.datetime.now() myPopy = subprocess.Popen(command, cwd=cwd, preexec_fn=os.seteuid(getUid(user)), shell=sheel, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) retval["pid"] = myPopy.pid log.debug("::singleProcessExecuter > Command \"%s\" got pid %s" % (" ".join(command), myPopy.pid)) try: retval["stdout"], retval["stderr"] = myPopy.communicate() myPopy.wait() except OSError, osErr: log.debug("::singleProcessExecuter > Got %s %s in myPopy.communicate() when trying get output of command %s. It is probably a bug (more info: http://bugs.python.org/issue1731717)" % (osErr, type(osErr), command[0])) except Exception, e: log.warn("::singleProcessExecuter > Got %s %s when trying to get stdout/stderr outputs of %s" % (type(e), e, " ".join(command))) log.debug("::singleProcessExecuter > Got %s %s when trying to get stdout/stderr outputs of %s. Showing traceback:\n%s" % (type(e), e, " ".join(command), traceback.format_exc())) raise retval["exitCode"] = myPopy.returncode retval["execTime"] = datetime.datetime.now() - startDatetime #print(":singleProcessExecuter > This is %s's retval:\n%s" % (" ".join(parameter), retval)) return retval 

Puedes probarlo con:

 print "This is the return: %s" % singleProcessExecuter(["ls", "-la"])