Unterprozessausgabe Zeile für Zeile streamen
Beim Umgang mit lauten Linux-Dienstprogrammen, die über einen Unterprozess in Python aufgerufen werden, effizientes Erfassen der Ausgabe sowohl in einer Protokolldatei und es dem Benutzer anzuzeigen kann eine Herausforderung sein.
Die Problem:
Anfangs versuchte ein Python-Skript, die Ausgabe von Unterprozessen mit dem folgenden Code zu erfassen:
for line in proc.stdout: # Filter output here print("test:", line.rstrip())
Dieser Ansatz zeigte jedoch nicht das gewünschte Verhalten des zeilenweisen Streamens der Ausgabe Linie. Stattdessen erschien die Ausgabe erst, nachdem eine erhebliche Menge generiert wurde.
Die Lösung:
Das Problem liegt in der Verwendung des Iterators für Zeile in proc.stdout. Dadurch wird die gesamte Ausgabe im Voraus gelesen. Um dieses Problem zu beheben, sollte stattdessen readline() verwendet werden:
# Filter output import subprocess proc = subprocess.Popen(['python', 'fake_utility.py'], stdout=subprocess.PIPE) while True: line = proc.stdout.readline() if not line: break # Filter output here print("test:", line.rstrip())
Mit dieser Änderung wird die Ausgabe nun Zeile für Zeile wie gewünscht gestreamt.
Überlegungen zur Pufferung:
Es ist wichtig zu beachten, dass der Unterprozess möglicherweise weiterhin die Ausgabe puffert. Um dies zu bewältigen, sind möglicherweise die Flush-Methode oder andere Techniken erforderlich, um eine rechtzeitige Anzeige der Ausgabe sicherzustellen.
Das obige ist der detaillierte Inhalt vonWie streame ich die Ausgabe eines Unterprozesses Zeile für Zeile in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!