Il mio script Python utilizza un sottoprocesso per chiamare un'utilità linux molto rumorosa. Voglio archiviare tutto l'output in un file di registro e mostrarne un po 'all'utente. Ho pensato che avrebbe funzionato quanto segue, ma l'output non viene visualizzato nella mia applicazione fino a quando l'utilità non ha prodotto una quantità significativa di output.
#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()
Il comportamento che desidero davvero è che lo script del filtro stampi ogni riga man mano che viene ricevuto dal sottoprocesso. Sorta piace quello che tee
fa ma con il codice Python.
Cosa mi sto perdendo? È possibile?
Aggiornare:
Se un sys.stdout.flush()
viene aggiunto a fake_utility.py, il codice ha il comportamento desiderato in python 3.1. Sto usando Python 2.6. proc.stdout.xreadlines()
Penseresti che usare funzionerebbe allo stesso modo di py3k, ma non lo fa.
Aggiornamento 2:
Ecco il codice di lavoro minimo.
#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,
invece diprint line.rstrip()
(nota: virgola alla fine).