Para obtener la salida del subproceso línea por línea tan pronto como el subproceso vacíe su búfer de salida estándar:
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()
se usa para leer líneas tan pronto como se escriben para solucionar el error de lectura anticipada en Python 2 .
Si el subproceso 'stdout usa un búfer de bloque en lugar de un búfer de línea en modo no interactivo (que conduce a un retraso en la salida hasta que el búfer del niño está lleno o vaciado explícitamente por el niño), entonces podría intentar forzar una salida sin búfer usando pexpect
, pty
módulos o unbuffer
, stdbuf
, script
utilidades , ver Q: ¿Por qué no sólo tiene que utilizar un tubo (popen ())?
Aquí está el código de 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 diferencia de Python 2, que genera cadenas de bytes de subprocesos tal cual; Python 3 usa el modo de texto (la salida de cmd se decodifica usando locale.getpreferredencoding(False)
codificación).