C'è un modo per interrogare un handle di file tornato da subprocess.Popen?
-
22-08-2019 - |
Domanda
Di 'Scrivo questo:
from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)
Ora, se faccio
line = p.stdout.readline()
il mio programma attende che il sottoprocesso emette la riga successiva.
C'è qualche magia che posso fare per p.stdout
così che ho potuto leggere l'output se è lì, ma basta continuare altrimenti? Sto cercando qualcosa di simile Queue.get_nowait()
So che posso solo creare un thread per la lettura p.stdout
, ma supponiamo che non posso creare nuove discussioni.
Soluzione
Utilizza il modulo select
nella libreria standard di Python, vedi http://docs.python.org/ biblioteca / select.html . select.select([p.stdout.fileno()], [], [], 0)
ritorna immediatamente una tupla i cui elementi sono tre liste:. il primo sta per essere non vuoto se c'è qualcosa da leggere su quel descrittore di file
Altri suggerimenti
Usa p.stdout.read(1)
questo leggerà carattere per carattere
Ed ecco un esempio 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()