2016-04-26 2 views
1

Mit dem Subprozess-Modul (Python 2.7), ich führe einen Befehl und versuchen, seine Ausgabe zu verarbeiten, wie es läuft.Python - Ausgabe von lang laufenden Subprozess lesen

Ich habe Code wie folgt aus:

process = subprocess.Popen(
    ['udevadm', 'monitor', '--subsystem=usb', '--property'], 
    stdout=subprocess.PIPE) 
for line in iter(process.stdout.readline, ''): 
    print(line) 

jedoch wird der Ausgang nur gedruckt, nachdem ich Strg + C, auch wenn ich sys.stdout.flush() nach der print-Anweisung hinzufügen.

Warum passiert das und wie kann ich die Ausgabe von diesem Prozess live streamen?

Bemerkenswert ist, dass dieser Befehl udevadm monitor nicht beendet werden soll, so dass ich nicht einfach warten kann, bis der Prozess beendet und seine Ausgabe auf einmal verarbeitet.

Ich fand live output from subprocess command aber der Ansatz in der angenommenen Antwort löste mein Problem nicht.

+0

siehe [die Links in den Absatz, der mit beginnt: "Wenn subprocess' stdout verwendet einen Block Pufferung"] (http://stackoverflow.com/a/17698359/ 4279) – jfs

Antwort

1

könnten Sie unbuffer verwenden:

process = subprocess.Popen(
    ["unbuffer", 'udevadm', 'monitor', '--subsystem=usb', '--property'], 
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
for line in iter(process.stdout.readline, ''): 
    print(line) 
+0

Danke! Das funktioniert. Aber gibt es eine Möglichkeit, dies nur mit Python zu tun? Ich würde es vorziehen, die 'expect'-Abhängigkeit zu vermeiden. –

+0

Leider kann ich nicht einen Weg sehen, aber das bedeutet sicherlich nicht, dass es nicht gibt, sehe ich einige Ausgaben, wenn ich etwas trennen und wieder an den Port verwenden, aber in Blöcken mehr als Linie gepuffert und immer noch eine anständige Verzögerung zwischen Ausgabe –