Das Problem ist, dass die pipe
ist voll. Der Unterprozess wird gestoppt und wartet darauf, dass die Pipe leer wird. Dann wird der Prozess (der Python-Interpreter) beendet und das Ende der Pipe wird unterbrochen (daher die Fehlermeldung).
p.wait()
wird dir nicht helfen:
Warnung Dies wird Deadlock, wenn das Kind Prozess genug Ausgang an ein stdout oder stderr Rohr, so dass es blockiert warten auf den Puffer O Rohr erzeugt mehr Daten zu übernehmen. Verwenden Sie communicate()
, um dies zu vermeiden.
Hinweis Die gelesenen Daten im Speicher gepuffert wird, so dass diese Methode nicht verwenden, wenn die Datengröße groß oder unbegrenzt ist:
http://docs.python.org/library/subprocess.html#subprocess.Popen.wait
p.communicate()
wird dir nicht helfen.
http://docs.python.org/library/subprocess.html#subprocess.Popen.communicate
p.stdout.read(num_bytes)
wird dir nicht helfen:
Warnung Verwenden communicate()
statt .stdin.write
, .stdout.read
oder .stderr.read
Deadlocks zu vermeiden, aufgrund einer der anderen OS Rohrpuffer füllen und den Kindprozess blockieren.
http://docs.python.org/library/subprocess.html#subprocess.Popen.stdout
Die Moral der Geschichte ist, für große Leistung, scheint subprocess.PIPE
macht Sie auf bestimmte Scheitern verurteilen, wenn Ihr Programm die Daten zu lesen versucht, (es mir, dass Sie in der Lage sein sollten zu setzen p.stdout.read(bytes)
in eine while p.returncode is None:
Schleife, aber die obige Warnung schlägt vor, dass dies Deadlock).
Die docs schlagen ein Shell-Rohr mit diesen ersetzt:
p1 = Popen(["zgrep", "thingiwant", "largefile"], stdout=PIPE)
p2 = Popen(["processreceivingdata"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
Hinweis, dass p2
seine Standardeingabe direkt von p1
nehmen. Diese sollte vermeiden Deadlocks, aber angesichts der widersprüchlichen Warnungen oben, Wer kennt.
Wie auch immer, wenn dieser letzte Teil für Sie nicht funktioniert (es sollte, obwohl), könnten Sie versuchen, eine temporäre Datei zu erstellen, alle Daten aus dem ersten Aufruf zu schreiben, und dann die temporäre Datei als Eingabe in den nächsten Prozess.
Verlassen Sie den Interpreter, bevor Ihr Subprozess 'p' beendet ist? – physicsmichael