Python - erfassen von stdout, Popen UND anzeigen auf der Konsole?
Ich will stdout aus einer long-ish Laufenden Prozess begann über subprocess.Popen(...)
also ich bin mit stdout=PIPE
als arg.
Jedoch, weil es einen lang andauernden Prozess, den ich auch wollen, senden Sie die Ausgabe an der Konsole (als ob ich noch nicht geleitet, es), um dem Benutzer des Skripts eine Ahnung, dass es noch funktioniert.
Ist, ist das überhaupt möglich?
Cheers.
Duplizieren: stackoverflow.com/questions/803265/... und stackoverflow.com/questions/874815/...
Verwandte: Python: Lesen Sie streaming input von Teilprozess.kommunizieren()
Verwandte: Python: Lesen Sie streaming input von Teilprozess.kommunizieren()
InformationsquelleAutor Steve Folly | 2009-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie einfach
print
es, wie Sie es Lesen aus der pipe?Eine leere Zeichenfolge zurückgegeben Lesen p.stdout bedeutet, dass das Kind Schloss seine stdout, aber nicht unbedingt, dass es beendet wird. p.wait() wartet, bis es zu beenden.
InformationsquelleAutor RichieHindle
Pufferung Ihre lang andauernde sub-Prozess wird wahrscheinlich durchführen wird Ihre Ausgabe in der Konsole Ruckeln und sehr schlechte UX. Ich schlage vor, Sie prüfen, statt mit pexpect (oder, unter Windows, wexpect) zu besiegen, Z-buffering und Holen Sie sich glatt, reguläre Ausgabe der von der sub-Prozess. Zum Beispiel (auf fast jedem unix - -y-system, nach der Installation von pexpect):
Den ba und bu kommen wird, mit dem richtigen timing (etwa einer Sekunde zwischen Ihnen). Beachten Sie die Ausgabe unterliegt nicht der normalen terminal-Verarbeitung, so dass die Zeilenumbrüche sind Links drin -- Sie müssen die post-Prozess-der string selbst (nur eine einfache
.replace
!-) wenn Sie brauchen\n
als end-of-line Marker (die fehlende Verarbeitung ist wichtig, nur für den Fall der sub-Prozess ist das schreiben von binären Daten in den stdout-dies stellt sicher, alle Daten bleiben intakt!-).InformationsquelleAutor Alex Martelli
S. Lott ist Author Punkte zu Erste Echtzeit-Ausgabe über subprocess und Echtzeit-abfangen von stdout von einem anderen Prozess in Python
Ich bin gespannt, Alex ' s Antwort hier anders ist seine Antwort 1085071.
Meine einfache kleine Experimente mit den Antworten in den beiden anderen referenziert Fragen gegeben hat, gute Ergebnisse...
Ging ich und sah an wexpect als pro Alex Antwort oben, aber ich muss sagen, das Lesen der Kommentare in den code, den ich nicht verlassen wurde, ein sehr gutes Gefühl, ihn zu benutzen.
Ich denke, die meta-Frage ist hier, Wann wird pexpect/wexpect eine der Mitgelieferten Batterien?
InformationsquelleAutor user135331
Inspiriert von pty.openpty() Vorschlag irgendwo oben, getestet auf python2.6, linux. Publishing seit es dauerte eine Weile, um dies richtig funktioniert, w/o-Pufferung...
InformationsquelleAutor maximk
Alternativ können Sie Rohr Sie Ihren Prozess in tee und erfassen nur einen der streams.
Etwas entlang der Linien von
sh -c 'process interesting stuff' | tee /dev/stderr
.Natürlich, dies funktioniert nur auf Unix-ähnlichen Systemen.
InformationsquelleAutor AI0867