python - español - Usando subproceso wait() y poll()
subprocess python español (2)
La respuesta de @ extraneon es un poco hacia atrás. Tanto wait()
como poll()
devuelven el código de salida del proceso si el proceso ha finalizado. El método poll()
devolverá None
si el proceso todavía se está ejecutando y el método wait()
se bloqueará hasta que el proceso finalice:
Visite la siguiente página: https://docs.python.org/3.4/library/subprocess.html#popen-objects
Popen.poll()
Compruebe si el proceso hijo ha finalizado. Establecer y devolver el atributo de código de retorno.
Popen.wait()
Espere a que termine el proceso hijo. Establecer y devolver el atributo de código de retorno.
Estoy intentando escribir una aplicación pequeña que usa el módulo de subprocess
.
Mi programa llama a un comando de Bash externo que tarda algún tiempo en procesarse. Durante este tiempo, me gustaría mostrarle al usuario una serie de mensajes como este:
Tratamiento. Por favor espera...
La salida es foo ()
¿Cómo puedo hacer esto usando Popen.wait()
o Popen.poll()
? He leído que necesito usar Popen.returncode
, pero no sé cómo puedo hacer que compruebe activamente el estado.
Tanto wait()
(con el timeout
especificado) como poll()
devuelven None
si el proceso aún no ha finalizado, y algo diferente si el proceso ha finalizado (creo que un entero, el código de salida, con suerte 0).
Editar :
wait()
y poll()
tienen diferentes comportamientos:
-
wait
(sin el argumento de tiempo de espera) se bloqueará y esperará a que se complete el proceso. -
wait
con el argumento de tiempo detimeout
esperará segundos detimeout
para que se complete el proceso. Si no se completa, lanzará la excepciónTimeoutExpired
. Si detecta la excepción, entonces puede continuar owait
nuevo. -
poll
siempre vuelve inmediatamente. Efectivamente, hace una espera con un tiempo de espera de 0, detecta cualquier excepción y devuelveNone
si el proceso no se ha completado. - Con
wait
opoll
, si el proceso se ha completado, se establecerá el código dereturncode
del objetoreturncode
(de lo contrario, es Ninguno, puede verificarlo tan fácilmente como la llamada enwait
o lapoll
), y el valor de retorno de la función también será el proceso. código de retorno.
</Edit>
Así que creo que deberías hacer algo como:
while myprocess.poll() is None:
print("Still working...")
# sleep a while
Tenga en cuenta que si la secuencia de comandos bash crea una gran cantidad de resultados, debe utilizar el communicate()
o algo similar para evitar que stdout o stderr se rellenen.