Ich versuche, ein Wrapper-Skript für ein Befehlszeilenprogramm (svnadmin verify) zu schreiben, das eine schöne Fortschrittsanzeige für den Vorgang anzeigt. Dies erfordert, dass ich jede Ausgabezeile des umschlossenen Programms sehen kann, sobald es ausgegeben wird.
Ich dachte mir, ich würde das Programm einfach ausführen subprocess.Popen
, verwenden stdout=PIPE
, dann jede Zeile beim Eingang lesen und entsprechend handeln. Als ich jedoch den folgenden Code ausführte, schien die Ausgabe irgendwo gepuffert zu sein, was dazu führte, dass sie in zwei Blöcken angezeigt wurde, den Zeilen 1 bis 332 und dann 333 bis 439 (die letzte Ausgabezeile).
from subprocess import Popen, PIPE, STDOUT
p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE,
stderr = STDOUT, shell = True)
for line in p.stdout:
print line.replace('\n', '')
Nachdem ich mir die Dokumentation zum Unterprozess ein wenig angesehen hatte, entdeckte ich den bufsize
Parameter to Popen
und versuchte, die Puffergröße auf 1 (Puffer für jede Zeile) und 0 (kein Puffer) zu setzen, aber keiner der Werte schien die Art und Weise zu ändern, in der die Zeilen geliefert wurden.
Zu diesem Zeitpunkt fing ich an, nach Strohhalmen zu greifen, also schrieb ich die folgende Ausgabeschleife:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
bekam aber das gleiche Ergebnis.
Ist es möglich, eine Echtzeit-Programmausgabe eines Programms zu erhalten, das unter Verwendung eines Unterprozesses ausgeführt wird? Gibt es in Python eine andere Option, die vorwärtskompatibel ist (nicht exec*
)?
sydout=PIPE
damit der Unterprozess direkt auf Ihre Konsole schreibt und den übergeordneten Prozess umgeht?