Unterprozeß stdout zeilenweise lesen

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()
Kommentar zu dem Problem - Öffnen
Sie könnte verwenden Sie print line statt print line.rstrip() (beachten Sie: das Komma am Ende). Kommentarautor: jfs
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+. Kommentarautor: Rooky

InformationsquelleAutor der Frage deft_code | 2010-05-10

Schreibe einen Kommentar