Mein Python-Skript verwendet einen Unterprozess, um ein Linux-Dienstprogramm aufzurufen, das sehr laut ist. Ich möchte die gesamte Ausgabe in einer Protokolldatei speichern und dem Benutzer einen Teil davon anzeigen. Ich dachte, das Folgende würde funktionieren, aber die Ausgabe wird in meiner Anwendung erst angezeigt, wenn das Dienstprogramm eine erhebliche Menge an Ausgabe erzeugt hat.
#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()
Das Verhalten, das ich wirklich möchte, besteht darin, dass das Filterskript jede Zeile druckt, wenn sie vom Unterprozess empfangen wird. Sorta mag was tee
macht aber mit Python Code.
Was vermisse ich? Ist das überhaupt möglich?
Aktualisieren:
Wenn a sys.stdout.flush()
zu fake_utility.py hinzugefügt wird, hat der Code das gewünschte Verhalten in Python 3.1. Ich benutze Python 2.6. Sie würden denken, dass die Verwendung proc.stdout.xreadlines()
genauso funktioniert wie py3k, aber das funktioniert nicht.
Update 2:
Hier ist der minimale Arbeitscode.
#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,
anstelle vonprint line.rstrip()
(Hinweis: Komma am Ende) verwenden.