¿Hay una manera de sondear un identificador de archivo de regresar de subprocess.Popen?

StackOverflow https://stackoverflow.com/questions/883152

  •  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.

¿Fue útil?

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()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top