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()
print line
statt print line.rstrip()
(beachten Sie: das Komma am Ende). InformationsquelleAutor der Frage deft_code | 2010-05-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist schon eine lange Zeit, seit ich zuletzt gearbeitet mit Python, aber ich denke, das problem ist mit der Aussage
for line in proc.stdout
liest die gesamte Eingabe vor Durchlaufen. Die Lösung ist die Verwendungreadline()
statt:Natürlich ist Sie noch zu tun haben mit dem Teilprozess' Pufferung.
Hinweis: laut der Dokumentation die Lösung mit einem iterator sollte gleichwertig sein mit
readline()
, mit Ausnahme der read-ahead-Puffer, aber (oder genau deshalb) die vorgeschlagene änderung hat zu unterschiedlichen Ergebnissen führen, für mich (Python 2.5 auf Windows XP).InformationsquelleAutor der Antwort Rômulo Ceccon
Bisschen spät zur party, aber war überrascht, nicht zu sehen, was ich denke ist die einfachste Lösung hier:
InformationsquelleAutor der Antwort jbg
In der Tat, wenn Sie sortiert den iterator dann die Pufferung könnte jetzt das problem sein. Man könnte sagen, die python in der sub-Prozess nicht auf Puffer, dessen Ausgang.
wird
Habe ich gebraucht dieser beim Aufruf von python in python.
InformationsquelleAutor der Antwort Steve Carter
Übergeben werden sollen diese zusätzlichen Parameter zu
subprocess.Popen
:Dann kann man iterieren, wie in Ihrem Beispiel. (Getestet mit Python 3.5)
InformationsquelleAutor der Antwort user1747134
Folgende änderung von Rômulo Antwort funktioniert bei mir auf Python 2 und 3 (2.7.12 und 3.6.1):
InformationsquelleAutor der Antwort mdh
Habe ich versucht, diese mit Python ist3, und es funktionierte, Quelle
InformationsquelleAutor der Antwort shakram02