Mi script de Python usa un subproceso para llamar a una utilidad de Linux que es muy ruidosa. Quiero almacenar todo el resultado en un archivo de registro y mostrarlo al usuario. Pensé que lo siguiente funcionaría, pero el resultado no aparece en mi aplicación hasta que la utilidad haya producido una cantidad significativa de resultados.
#fake_utility.py, just generates lots of output over time
import time
i = 0
while True:
print hex(i)*512
i += 1
time.sleep(0.5)
#filters output
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
for line in proc.stdout:
#the real code does filtering here
print "test:", line.rstrip()
El comportamiento que realmente quiero es que el script de filtro imprima cada línea tal como se recibe del subproceso. Sorta como lo que tee
hace pero con código python.
¿Qué me estoy perdiendo? ¿Es esto posible?
Actualizar:
Si sys.stdout.flush()
se agrega a fake_utility.py, el código tiene el comportamiento deseado en python 3.1. Estoy usando python 2.6. Se podría pensar que usar proc.stdout.xreadlines()
funcionaría igual que py3k, pero no es así.
Actualización 2:
Aquí está el código de trabajo mínimo.
#fake_utility.py, just generates lots of output over time
import sys, time
for i in range(10):
print i
sys.stdout.flush()
time.sleep(0.5)
#display out put line by line
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
#works in python 3.0+
#for line in proc.stdout:
for line in iter(proc.stdout.readline,''):
print line.rstrip()
print line,
lugar deprint line.rstrip()
(nota: coma al final).