Possible Duplicate:
Wrap subprocess' stdout/stderrKönnen Sie einen Python-Subprozess stdout und stderr wie gewohnt ausgeben, aber auch die Ausgabe als String erfassen?
In this question, hanan-n gefragt, ob es möglich war, eine Python subprocess zu haben, die auf der Standardausgabe ausgibt, während auch die Ausgabe in einer Zeichenfolge für eine spätere Verarbeitung zu halten. Die Lösung war in diesem Fall über jede Ausgangsleitung Schleife und drucken Sie sie manuell:
output = []
p = subprocess.Popen(["the", "command"], stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
print(line)
output.append(line)
Diese Lösung ist jedoch nicht auf den Fall nicht verallgemeinern, wo Sie dies sowohl für stdout und stderr tun wollen, während die Befriedigung folgende:
- die Ausgabe von stdout/stderr zu den übergeordneten Prozess gehen sollte stdout/stderr bzw.
- die Ausgabe in Echtzeit so viel wie möglich getan werden sollte (aber ich nur Zugriff auf die Saiten müssen bei das Ende)
- der o rder zwischen stdout und stderr Zeilen sollte nicht geändert werden (ich bin mir nicht ganz sicher, wie das auch funktionieren würde, wenn der Subprozess seine stdout und stderr caches in verschiedenen Intervallen leert; Lassen Sie uns jetzt davon aus, dass wir alles in schöne Stücke erhalten, die durchgezogenen Linien enthalten?)
ich durch die subprocess documentation sah, konnte aber nichts finden, dass dies erreicht werden kann. Der nächste, den ich finden könnte, ist stderr=subprocess.stdout
hinzuzufügen und die gleiche Lösung wie oben zu verwenden, aber dann verlieren wir die Unterscheidung zwischen regulärer Ausgabe und Fehlern. Irgendwelche Ideen? Ich nehme an, die Lösung - falls es eine gibt - beinhaltet asynchrone Lesevorgänge an p.stdout
und p.stderr
. Hier
ist ein Beispiel dafür, was Ich mag würde tun:
p = subprocess.Popen(["the", "command"])
p.wait() # while p runs, the command's stdout and stderr should behave as usual
p_stdout = p.stdout.read() # unfortunately, this will return '' unless you use subprocess.PIPE
p_stderr = p.stderr.read() # ditto
[do something with p_stdout and p_stderr]
Ich sehe nicht, wie diese Technik (umhüllen keine IO-Funktionen und Stream-Objekte) nicht verallgemeinert? – ninjagecko
Wie empfehlen Sie, dass ich den Subprozess in Echtzeit auf stdout und stderr drucke, während am Ende die Ausgabe in einer Zeichenkette bleibt? – pflaquerre