Estoy tratando de escribir un script de contenedor para un programa de línea de comando (svnadmin verificar) que mostrará un buen indicador de progreso para la operación. Esto requiere que pueda ver cada línea de salida del programa envuelto tan pronto como salga.
Pensé que simplemente ejecutaría el programa usando subprocess.Popen
, use stdout=PIPE
, luego leería cada línea tal como venía y actuaría en consecuencia. Sin embargo, cuando ejecuté el siguiente código, la salida parecía estar almacenada en algún lugar, haciendo que apareciera en dos fragmentos, líneas 1 a 332, luego 333 a 439 (la última línea de salida)
from subprocess import Popen, PIPE, STDOUT
p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE,
stderr = STDOUT, shell = True)
for line in p.stdout:
print line.replace('\n', '')
Después de mirar un poco la documentación sobre el subproceso, descubrí el bufsize
parámetro Popen
, así que intenté establecer bufsize en 1 (buffer cada línea) y 0 (sin buffer), pero ninguno de los valores parecía cambiar la forma en que se entregaban las líneas.
En este punto, comenzaba a comprender las pajillas, así que escribí el siguiente ciclo de salida:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
pero obtuve el mismo resultado.
¿Es posible obtener la salida del programa 'en tiempo real' de un programa ejecutado usando un subproceso? ¿Hay alguna otra opción en Python que sea compatible con versiones anteriores (no exec*
)?
sydout=PIPE
para que el subproceso escriba directamente en tu consola, sin pasar por el proceso principal?