2013-01-21 12 views
6

Ich versuche Ausgabe von einem anderen Skript zu bekommen, subprocess.Popen Pythons mit wie folgtPython Popen(). Stdout.read() hängen

process = Popen(command, stdout=PIPE, shell=True) 
exitcode = process.wait() 
output = process.stdout.read() # hangs here 

Es befindet sich auf der dritten Zeile hängt, nur wenn ich laufe es als Python-Skript und ich kann das nicht in der Python-Shell reproduzieren.

Das andere Skript druckt nur ein paar Worte und ich nehme an, dass es kein Pufferproblem ist.

Hat jemand eine Vorstellung davon, was ich hier falsch mache?

+0

Und wenn Sie den Befehl in 'Befehl' manuell ausführen, generiert es Ausgabe? –

Antwort

0

Sie möchten wahrscheinlich .communicate() statt .wait() plus .read() verwenden. Beachten Sie die Warnung über wait() auf der subprocess Dokumentationsseite:

Diese Warnung wird Deadlock bei der Verwendung von stdout=PIPE und/oder stderr=PIPE und der Kindprozess erzeugt genug Ausgang an ein Rohr, so dass sie Bausteine ​​für das OS Rohrpuffer warten, um zu akzeptieren, mehr Daten. Verwenden Sie communicate(), um dies zu vermeiden.

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait

+0

Danke für die Antwort. Ich habe gerade gemerkt, dass ich diesen Teil der Dokumentation gelesen habe. Was ich tat, war, die stdout-Echtzeit in einem 'while-Prozess zu holen. Poll() ist None:' Schleife, während das Skript läuft, und der obige Code war ein abgespeckte Version. Aber ich denke, es war wegen eines ähnlichen Deadlock-Problems hängen geblieben ... – lyomi

0

read() wartet auf EOF vor der Rückkehr.

Sie können:

  • Warten auf die subprocess zu sterben, dann lesen() gibt.
  • Verwenden Sie readline(), wenn Ihre Ausgabe in Zeilen aufgeteilt ist (wird immer noch hängen, wenn keine Zeilen ausgegeben werden).
  • Verwenden Sie os.read (F, N), die höchstens N Bytes von F zurückgibt, aber immer noch blockiert, wenn die Pipe leer ist (es sei denn, O_NONBLOCK ist auf fd gesetzt).