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