example español python subprocess

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 de timeout esperará segundos de timeout para que se complete el proceso. Si no se completa, lanzará la excepción TimeoutExpired . Si detecta la excepción, entonces puede continuar o wait nuevo.
  • poll siempre vuelve inmediatamente. Efectivamente, hace una espera con un tiempo de espera de 0, detecta cualquier excepción y devuelve None si el proceso no se ha completado.
  • Con wait o poll , si el proceso se ha completado, se establecerá el código de returncode del objeto returncode (de lo contrario, es Ninguno, puede verificarlo tan fácilmente como la llamada en wait o la poll ), 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.