Salida de subproceso de captura de Python después de la terminación

Estoy intentando obtener una salida de subproceso (en Windows) en el momento en que se produce la excepción TimeoutExpired. ¿Algunas ideas?

try: proc = subprocess.run(cmd,timeout=3) except subprocess.TimeoutExpired: print(???) 

Debe usar Popen y subprocess.PIPE para capturar la salida del proceso cuando el tiempo de espera expire. En particular Popen.communicate es lo que necesitas. Aquí hay un ejemplo

 proc = subprocess.Popen(["ping", "192.168.1.1"], stdout=subprocess.PIPE) try: output, error = proc.communicate(timeout=2) except subprocess.TimeoutExpired: proc.kill() output, error = proc.communicate() print(output) print(error) 

Esto imprimirá la salida del proceso hasta el vencimiento del tiempo de espera.

Si no puede usar el timeout de timeout por cualquier razón (una de ellas es una versión muy antigua de python), aquí está mi solución, que funciona con cualquier versión de python:

  • cree un hilo que primero espere y luego mate el objeto de subprocess
  • en el hilo principal, lea las líneas en un bucle.

Estoy usando un subproceso python, ejecutando con la opción -u (sin búfer):

transmisor.py: (progtwig de prueba que imprime “hola xx” cada 1/10 de segundo)

 import time i=0 while True: print("hello {}".format(i)) i += 1 time.sleep(0.1) 

el progtwig en sí (tiempo de espera establecido en 1,5 segundos):

 import subprocess,threading,time def timeout(p,timeout): time.sleep(timeout) p.kill() p = subprocess.Popen(["python","-u","transmitter.py"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT) t = threading.Thread(target=timeout,args=(p,1.5)) t.start() output = [] for line in p.stdout: output.append(line.decode()) t.join() print("".join(output)) 

Al final, después de un tiempo de espera, el progtwig imprime:

 hello 0 hello 1 hello 2 hello 3 hello 4 hello 5 hello 6 hello 7 hello 8 hello 9 hello 10 hello 11 hello 12 hello 13 hello 14