Per ottenere l'output del sottoprocesso riga per riga non appena il sottoprocesso svuota il suo buffer stdout:
from subprocess import Popen, PIPE
p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1)
with p.stdout:
for line in iter(p.stdout.readline, b''):
print line,
p.wait()
iter()
viene utilizzato per leggere le righe non appena vengono scritte per aggirare il bug della lettura anticipata in Python 2 .
Se lo stdout del sottoprocesso utilizza un buffer di blocco invece di un buffer di riga in modalità non interattiva (che porta a un ritardo nell'output fino a quando il buffer del bambino non è pieno o scaricato esplicitamente dal figlio) allora potresti provare a forzare un output senza buffer usando pexpect
, pty
moduli o unbuffer
, stdbuf
, script
utilità , vedere D: Perché non basta usare un tubo (popen ())?
Ecco il codice Python 3:
from subprocess import Popen, PIPE
with Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1,
universal_newlines=True) as p:
for line in p.stdout:
print(line, end='')
Nota: a differenza di Python 2 che restituisce le stringhe di sottoprocesso così come sono; Python 3 utilizza la modalità testo (l'output di cmd viene decodificato utilizzando la locale.getpreferredencoding(False)
codifica).