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
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.
Ich dachte, ich würde eine Lösung teilen, die .poll (), .wait () oder .communicate () nicht verwendet. Ein paar Punkte:
import codecs
, weil meine Ausgabe ostasiatischen UTF-8-Text enthält try:
ein, um beschädigten / ungültigen UTF-8-Text '\x0a'
, um Linux-Newline unabhängig von der Plattform zu erzwingen. for line in iter(subproc.stderr.readline, ''):
, wenn Sie stderr Code:
%Vor%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.
Tags und Links python subprocess