¿Hay una manera de sondear un identificador de archivo de regresar de subprocess.Popen?
-
22-08-2019 - |
Pregunta
Digamos que escribir esto:
from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)
Ahora bien, si hago
line = p.stdout.readline()
mi programa espera hasta que el subproceso da salida a la línea siguiente.
¿Hay alguna magia que pueda hacer para p.stdout
para que pudiera leer la salida si está allí, pero sólo seguir de otra manera? Busco algo así como Queue.get_nowait()
Sé que sólo puede crear un hilo para leer p.stdout
, pero vamos a suponer que no puedo crear nuevos temas.
Solución
Utilice el módulo select
en la biblioteca estándar de Python, consulte http://docs.python.org/ biblioteca / select.html . select.select([p.stdout.fileno()], [], [], 0)
vuelve inmediatamente una tupla cuyos artículos son tres listas:. el primero que va a ser que no esté vacía si hay algo que leer en ese descriptor de archivo
Otros consejos
El uso de este p.stdout.read(1)
leerá carácter por carácter
Y aquí es un ejemplo completo:
import subprocess
import sys
process = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()