2011-11-09 30 views
8

Me gustaría obtener el resultado (declaraciones de impresión) y devolver el estado de un subproceso de Python junto con la visualización de la información de registro. Estoy usando Python 2.5 en Windows XP. ¿Cómo obtengo el código de retorno también? Aquí en este extracto, estoy leyendo la salida para poder redirigirla y mostrarla en wxPython TextCtrl en un hilo separado.Devuelve el valor del subproceso de Python

self.myproc.poll()      
if self.myproc.returncode is None:    
    # Still running so check stdout 
    txt = self.myproc.stdout.read(self._readblock)  
    if txt:   
     # Add to UI's update queue 
     self._parent.AppendUpdate(txt)   
    else: 
     break  

Respuesta

7

El código de retorno se devuelve la llamada poll, y también es (una vez poll no arrojó None), accesible a través del atributo returncode. Ya estás usando esto en tu código, así que no estoy seguro de cuál es tu problema.

Cuando desee actualizar su control mientras se está ejecutando su proceso, use readline en lugar de read: este último esperará a que aparezca toda la salida, mientras que el primero esperará en un carácter de nueva línea. Para dar un ejemplo completo utilizando sus nombres de variables:

from subprocess import Popen, PIPE 
self.myproc = Popen('dir /s', shell=True, stdout=PIPE, stderr=PIPE) 
while self.myproc.poll() == None: 
    self._parent.AppendUpdate(self.myproc.stdout.readline()) 
self._parent.AppendUpdate('Return code was ' + self.myproc.returncode) 

Tenga en cuenta que es posible que desee .strip() el resultado readline ya que contendrá el carácter de nueva línea.

Editar: Para resolver su confusión entre el resultado del script y su código de retorno, haga lo siguiente. En primer lugar, una secuencia de comandos de Python a nivel de módulo no puede devolver un valor: eso produciría un error de sintaxis. Entonces, lo que debe diferenciar es el resultado del script y el código de retorno que proporciona.

La salida del script se lee en el ejemplo anterior utilizando el método self.myproc.stdout.readline. Cada vez que el proceso externo ha producido una línea de texto entregado, llamar a esa función lo recuperaría.

Sin embargo, el código de retorno (o estado de salida) es un número entero que se pasa de un proceso hijo al proceso principal (su), indicando el estado en el que salió el proceso hijo. En Python, puede hacer esto con la función sys.exit. Más comúnmente, cuando este valor es cero, indica éxito; un valor distinto de cero representa algún tipo de error.

Diga su script proceso hijo se parece a esto:

import sys 
# Do some stuff 
print 'pass' # Gets to stdout 
sys.exit(0)  # Return code 

La ejecución de este archivo externo (vamos a llamarlo test.py) con la clase Popen, obtendremos pass cuando leemos a cabo self.myproc.stdout y 0 cuando leemos self.myproc.poll (o self.myproc.returncode después de la primera encuesta).

El propósito de este código de retorno es que no tiene que analizar toda la salida del proceso secundario para determinar si tuvo éxito en su trabajo: puede definir sus propios códigos de salida. Por ejemplo, puede considerar 0 como un éxito, 1 como un error, 2 como un tipo de entrada no válida, 9 es un error desconocido, y así sucesivamente. De esta forma, puede mantener poll en el proceso y, de acuerdo con el código de salida devuelto por esa encuesta, sabrá directamente si fue exitoso. Tenga en cuenta que esto es un poco menos aplicable a su caso, ya que necesita la salida del proceso hijo de todos modos, pero aún así es más fácil analizar un número que una cadena para determinar el éxito.

+0

el comando en mi proceso es un archivo python y devuelve un valor, por ejemplo, una cadena como 'Pase' o 'Fallo'.Solo estaba obteniendo valores de retorno como 0 o 1 – user974168

+0

Ah, entonces solo necesita analizar la última línea de 'stdout'. El código de retorno es una indicación de la condición de salida del programa, y ​​es un número entero. – jro

+0

Lo siento, no entendí tu comentario. Por motivo de la discusión del proceso de llamada es como este def main(): a = 5 b = 6 c = a + b de impresión c retorno 'PASS' si __name__ == '__main__': main() ¿Cómo obtendrá el valor de retorno 'PASS' aquí? – user974168

Cuestiones relacionadas