2009-11-30 7 views
6

Ich führe ein Unterprogramm mit subprocess.popen. Wenn ich mein Python-Programm über das Befehlsfenster (cmd.exe) starte, schreibt das Programm einige Informationen und Daten in das Fenster, während sich das Programm weiterentwickelt.Asynchron gelesen stdout von subprocess.Popen

Wenn ich meinen Python-Code nicht in einem Befehlsfenster ausführen, wird ein neues Befehlsfenster für die Ausgabe dieses Unterprogramms geöffnet, und das möchte ich vermeiden. Wenn ich den folgenden Code verwendet, ist es nicht das CMD-Fenster zeigen, aber es kann nicht gedruckt werden auch nicht den Status:

p = subprocess.Popen("c:/flow/flow.exe", shell=True, stdout=subprocess.PIPE) 
print p.stdout.read() 

Wie kann ich das Teilprogramm der Ausgabe in der Ausgabe meines Programms zeigen, wie sie auftritt? diese

+2

Warum ist dieses Community-Wiki? –

+2

"Windows-Fenster" Was Windows-Fenster? Verwenden Sie ein GUI-Framework? Welcher? –

+0

Nun, ich führe das Modell durch Arcgis. Wenn ich auf mein Tool klicke, das ich dort erstellt habe, erscheint ein Fenster und zeigt den Fortschritt an. Ich möchte Zeilen in meinem Befehlsfenster sehen. – Mesut

Antwort

7

Verwendung:

cmd = subprocess.Popen(["c:/flow/flow.exe"], stdout=subprocess.PIPE) 
for line in cmd.stdout: 
    print line.rstrip("\n") 
cmd.wait() # you may already be handling this in your current code 

Beachten Sie, dass Sie nach wie vor für das Unterprogramm warten, um seine stdout Puffer zu spülen (die unterschiedlich häufig gepuffert wird, wenn es nicht zu einem Terminal-Fenster zu schreiben), so können Sie nicht jede Zeile sofort sehen, während das Unterprogramm sie druckt (dies hängt von verschiedenen Betriebssystemdetails und Details des Unterprogramms ab).

Beachten Sie auch, wie ich die Shell = True entfernt und ersetzt das String-Argument mit einer Liste, die im Allgemeinen empfohlen wird.

+0

alternativ zu dem 'line.rstrip ..' können Sie 'line,' (beachten Sie das nachstehende Komma) –

+2

['für Zeile in iter (cmd.stdout.readline," "): print line,'] (http://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line) könnte eine direktere Ausgabe bereitstellen, indem möglicherweise ein Read-Ahead-Puffer im Datei-Iterator vermieden wird (Hinweis: das Unterprogramm muss immer noch seine stdout löschen) – jfs

+1

Ich verstehe nicht, warum das async ist. – ManuelSchneid3r

Verwandte Themen