2010-06-08 9 views
16

Estoy intentando escribir una pequeña aplicación que usa el módulo subprocess.Usando el subproceso wait() y poll()

Mi programa llama a un comando Bash externo que lleva algún tiempo procesar. Durante este tiempo, me gustaría mostrar al usuario una serie de mensajes como este:

Processing. Por favor, espere ...
La salida es foo()

¿Cómo puedo hacer esto usando Popen.wait() o Popen.poll(). He leído que necesito usar el Popen.returncode, pero cómo puedo conseguir que compruebe activamente el estado, no lo sé.

Respuesta

16

Tanto wait() (con timeout especificada) y poll() retorno None si el proceso aún no ha terminado, y algo diferente si el proceso tiene terminado (creo que un entero, el código de salida, es de esperar 0).

Editar:

wait() y poll() tienen diferentes comportamientos:

  • wait (sin el argumento timeout) bloqueará y esperar a que el proceso se complete.
  • wait con el argumento de tiempo de espera esperará timeout segundos para que se complete el proceso. Si no se completa, lanzará la excepción TimeoutExpired. Si detecta la excepción, puede continuar o volver al wait.
  • poll siempre regresa inmediatamente. Efectivamente espera con un tiempo de espera de 0, detecta cualquier excepción y devuelve None si el proceso no se ha completado.
  • Con cualquiera wait o poll, si el proceso se ha completado, se establecerá de returncode el objeto popen (de lo contrario no es asunto - se puede comprobar que la misma facilidad que llamar wait o poll), y el valor de retorno de la función también ser el código de retorno del proceso.

</Editar>

y pienso que uno debe hacer algo como:

while myprocess.poll() is None: 
    print("Still working...") 
    # sleep a while 

Tenga en cuenta que si la escritura del golpe crea una gran cantidad de la producción debe utilizar communicate() o algo similar para evitar stdout o stderr para rellenar.

+0

Estoy usando communicate(). Pero no entiendo cómo puedo devolver el código de retorno mientras se está ejecutando el proceso. – user225312

+0

Lo resolví haciendo esto: if process.poll() es None: print 'Working' – user225312

+4

Esta respuesta es incorrecta. Verifique la respuesta de @onenone –

23

La respuesta de @extraneon es un poco al revés. Tanto wait() como poll() devuelven el código de salida del proceso si el proceso ha finalizado.El método poll() volverá None si el proceso todavía está en marcha y el método wait() bloqueará hasta que el proceso sale:

Mira la siguiente página: https://docs.python.org/3.4/library/subprocess.html#popen-objects

Popen.poll()

Comprobar si el proceso hijo tiene terminado. Establecer y devolver el atributo de código de retorno.

Popen.wait()

Espere proceso hijo. Establecer y devolver el atributo de código de retorno.

Cuestiones relacionadas