Meu script python usa subprocesso para chamar um utilitário linux que é muito barulhento. Eu quero armazenar toda a saída em um arquivo de log e mostrar algumas delas para o usuário. Eu pensei que o seguinte funcionaria, mas a saída não aparece no meu aplicativo até que o utilitário tenha produzido uma quantidade significativa de saída.
#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()
O comportamento que eu realmente quero é que o script de filtro imprima cada linha conforme é recebida do subprocesso. Tipo como o que tee
faz, mas com código python.
o que estou perdendo? Isso é possível?
Atualizar:
Se a sys.stdout.flush()
for adicionado ao fake_utility.py, o código terá o comportamento desejado no python 3.1. Estou usando o python 2.6. Você pensaria que o uso proc.stdout.xreadlines()
funcionaria da mesma forma que o py3k, mas não.
Atualização 2:
Aqui está o código de trabalho 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,
vez deprint line.rstrip()
(nota: vírgula no final).