Speichern von stdout aus subprocess.Popen Zeile für Zeile

8

Mein Python-Skript verwendet den Subprozess, um ein anderes Skript aufzurufen, das die Ausgabe sehr langsam (Zeile für Zeile) erzeugt. Ich möchte die Ausgabe Zeile für Zeile in Datei nicht schreiben, wenn der gesamte Prozess endet und schreibt die gesamte Ausgabe als String.Der folgende Code schreibt die Ausgabe in "Datei", wenn das "Skript" endet.

%Vor%

Ist es überhaupt möglich? Danke, Chris

    
Chris 02.03.2011, 17:45
quelle

4 Antworten

2

Sie können mit dem Prozess interagieren, indem Sie poll verwenden, damit Sie versuchen können, mit ihm Zeile für Zeile zu interagieren:

Zum Beispiel:

%Vor%     
stderr 02.03.2011 18:51
quelle
1

Ja, das ist möglich. Hier ist eine Funktion, die ich für einen Test-Kabelbaum geschrieben habe, um Komponententests von Python-Shell-Skripten durchzuführen.

%Vor%

Die Funktion gibt ein Tupel zurück, das die Shell-Returncode-Ausgaben nach sys.exit() , den Standardausgabetext und den Standardfehlerausgabetext enthält. Sie sind beide Textzeichenfolgen, also müssten Sie splitlines verwenden, um sie vor der Verarbeitung in Zeilen zu zerlegen.

Wenn Sie wirklich Zeile für Zeile mit der Ausgabe interagieren müssen, ist es wahrscheinlich besser pexpect zu verwenden als das subprocess -Modul.

    
Michael Dillon 02.03.2011 17:52
quelle
1

Ich dachte, ich würde eine Lösung teilen, die .poll (), .wait () oder .communicate () nicht verwendet. Ein paar Punkte:

  • Ich verwende import codecs , weil meine Ausgabe ostasiatischen UTF-8-Text enthält
  • Ich fange jede Zeile mit try: ein, um beschädigten / ungültigen UTF-8-Text
  • herauszufiltern
  • Ich benutze '\x0a' , um Linux-Newline unabhängig von der Plattform zu erzwingen.
  • Verwenden Sie for line in iter(subproc.stderr.readline, ''): , wenn Sie stderr
  • erfassen müssen
  • Dieser Ansatz erzeugt nur dann Ausgabe, wenn das untergeordnete Programm die Ausgabe erstellt
  • Die Verwendung des kw-Wörterbuchs ist für dieses Beispiel übertrieben, zeigt aber, wie ** kwargs with subprocess
  • verwendet wird

Code:

%Vor%     
tahoar 01.08.2011 11:29
quelle
0

Ich hatte das gleiche Problem für eine Programmiersprache, an der ich gerade arbeite, und endete damit: Ссылка

Leider wird dabei immer nur ein Zeichen aus dem Ausgabestrom gelesen, und die Zeile wird so lange akkumuliert, bis eine neue Zeile gefunden wird. Es funktioniert jedoch, und ich kenne keinen anderen Weg, um das gleiche Verhalten zu erreichen.

    
perimosocordiae 02.03.2011 18:04
quelle

Tags und Links