Ich versuche, stdout.readline
und die Ergebnisse (d. H. Jede Zeile, zum Zeitpunkt des Drucks sie an das Terminal) auf eine multiprocessing.Queue
für uns in einer anderen .py-Datei. Doch der Ruf:Python lesen Popen kontinuierlich (Windows)
res = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=1)
with res.stdout:
for line in iter(res.stdout.readline, b''):
print line
res.wait()
blockiert und die Ergebnisse werden nach gedruckt werden der Prozess abgeschlossen ist (oder gar nicht, wenn Exit-Code nicht zurückgegeben wird).
Ich habe SO für Antworten darauf durchsucht, und habe versucht, bufsize = 1, Laichen Threads, die das Lesen behandeln, mit Filedescripts, etc. Keine scheint zu funktionieren. Ich muss vielleicht das Modul pexpect
verwenden, aber ich bin mir nicht sicher, wie es noch funktioniert.
Ich habe auch versucht,
def enqueue_output(self, out, queue):
for line in iter(out.readline, b''):
queue.put([line])
out.close()
Um die Daten in die Warteschlange gestellt, aber da out.readline
zu blockieren scheint, wird das Ergebnis das gleiche sein.
Kurz gesagt: Wie stelle ich die Subprozessausgabe zum Zeitpunkt des Drucks zur Verfügung? Er druckt Stücke von 1-10 Zeilen zu einer Zeit, aber diese mir zurückgegeben werden, wenn der Prozess abgeschlossen ist, aber auch ..
Verwandte durch Zeilenumbrüche getrennt:
Python subprocess readlines() hangs
Python: read streaming input from subprocess.communicate()
Non-blocking read on a subprocess.PIPE in python
Sie müssen herausfinden, ob das Programm über eine Befehlszeilenoption zum Deaktivieren der Pufferung oder zum Verwenden eines interaktiven Modus verfügt, z. B. Pythons Optionen "-u" und "-i". Sonst puffert es höchstwahrscheinlich das Schreiben in seine "stdout", wenn es sieht, dass es eine Pipe ist. Die Ausgabe wird nur in die Pipe geschrieben, wenn der Puffer voll ist oder wenn das Programm den Puffer manuell löscht oder wenn es beendet wird. Python am anderen Ende der Pipe hat keine Kontrolle über dieses Verhalten. – eryksun
Sie erwähnen Pexpect und haben die Frage markiert "Pty", aber Windows hat keine Terminals und Pseudo-Terminals. Pexpect kommt winpexpect am nächsten, verwendet aber Pipes, um das Pufferungsproblem nicht zu lösen. Die korrekte Handhabung in Windows erfordert die Konsolen-API, möglicherweise indem ein Hilfsprogramm an eine fensterlose Konsole angehängt wird, um die Ausgabe des Programms zu lesen und in seine Eingabe zu schreiben.Ich habe kein Python-Modul gesehen, das dies für Windows implementiert. – eryksun
@eryksun Ich entfernte das PTY-Tag. Ich hatte Angst, dass das Problem in dem Prozess liegt, den ich anrufe. Ich werde den zuständigen Entwickler darum bitten müssen. Es scheint einige Probleme bei der Pufferung zu geben, wenn Windows ausgeführt wird und die Subprozess- und Befehlszeilenfunktionen verwendet werden. – enrm