Lesen Teilprozess stdout zeilenweise

Mein python-Skript verwendet Teilprozess zu nennen, ein linux-Dienstprogramm, das ist sehr laut. Ich möchte speichern Sie die Ausgabe in eine log-Datei und zeigen einige der Benutzer. Ich dachte, die folgenden funktionieren würde, aber die Leistung nicht zeigen, bis in meine Anwendung, bis das Dienstprogramm hat produziert eine signifikante Menge an Ausgaben.

#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()

Dem Verhalten, das ich wirklich will, ist für das filter-Skript zu drucken jeder Zeile, wie es empfangen wird, aus dem Teilprozess. Sorta wie, was tee hat, sondern mit python-code.

Was bin ich? Ist das überhaupt möglich?


Update:

Wenn ein sys.stdout.flush() Hinzugefügt fake_utility.py hat der code das gewünschte Verhalten in python 3.1. Ich bin mit python 2.6. Sie würden denken, dass mit proc.stdout.xreadlines() würde die gleiche Arbeit, wie py3k, aber es funktioniert nicht.


Update 2:

Ist hier der minimale code arbeiten.

#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()
könnten Sie print line, statt print line.rstrip() (Hinweis: das Komma am Ende).
Verwandte: Python: Lesen Sie streaming input von subprocess.communicate()
Update 2 heißt es, dass es funktioniert mit python 3.0+ benutzt aber die alte print-Anweisung, so funktioniert das nicht mit python 3.0+.
Keine der Antworten hier aufgelistet arbeitete für mich, aber stackoverflow.com/questions/5411780/... haben!

InformationsquelleAutor deft_code | 2010-05-10

Schreibe einen Kommentar