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()
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
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).file.readline()
vs.for line in file
finden Sie unter bugs.python.org/issue3907 (kurz gesagt: es funktioniert auf Python ist3; verwendenio.open()
auf Python 2.6+)Die mehr pythonic test für ein EOF-pro der "Programmier-Empfehlungen" in PEP-8 (python.org/dev/peps/pep-0008), wäre, " wenn nicht Zeile:'.
für Rohre:
for line in iter(proc.stdout.readline, ''):
.ja. 1. könnten Sie
for line in proc.stdout
auf Python 3 (es gibt keinen der read-ahead-bug) 2.'' != b''
auf Python 3 -- don ' T copy-paste den code blind-denken, was es tut und wie es funktioniert.python hängt bei readLine()
InformationsquelleAutor Rômulo Ceccon
Bisschen spät zur party, aber war überrascht, nicht zu sehen, was ich denke ist die einfachste Lösung hier:
AttributeError: 'file' object has no attribute 'readable'
py2.7Funktioniert mit python 3
Klar, dieser code ist nicht gültig für mehrere Gründe, py3/py3-Kompatibilität und der realen Gefahr des Erhaltens ValueError: I/O operation on closed file
InformationsquelleAutor 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 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)
Es sollte funktionieren, wenn mit der subprocess32 Paket.
InformationsquelleAutor user1747134
Habe ich versucht, diese mit Python ist3, und es funktionierte, Quelle
InformationsquelleAutor shakram02
Folgende änderung von Rômulo Antwort funktioniert bei mir auf Python 2 und 3 (2.7.12 und 3.6.1):
InformationsquelleAutor mdh
Können Sie auch Zeilen gelesen werden w/o-Schleife. Funktioniert in Python ist3.6.
InformationsquelleAutor Aiven