Wie schreibe ich Skriptausgaben in Datei und Befehlszeile?

7

Ich habe ein Python-Skript mit langer Laufzeit, das ich über die Befehlszeile ausführe. Das Skript schreibt Fortschrittsmeldungen und Ergebnisse in die Standardausgabe. Ich möchte alles, was das Skript schreibt, auf die Standardausgabe in einer Datei aufzeichnen, sehe es aber auch in der Befehlszeile. Alternativ möchte ich, dass die Ausgabe sofort in die Datei geht. Daher kann ich tail verwenden, um den Fortschritt anzuzeigen. Ich habe es versucht:

%Vor%

Aber es produziert keine Ausgabe (nur das Ausführen des Skripts erzeugt die Ausgabe wie erwartet). Kann jemand eine einfache Lösung vorschlagen? Ich benutze Mac OS X 10.6.4.

Bearbeiten Ich verwende print für die Ausgabe in meinem Skript.

    
Björn Pollex 26.09.2010, 13:23
quelle

3 Antworten

16

Sie befinden sich auf dem richtigen Pfad, aber das Problem ist, dass Python die Ausgabe puffert.

Glücklicherweise gibt es eine Möglichkeit zu sagen, dass die Ausgabe nicht gepuffert wird:

%Vor%     
Imre L 26.09.2010, 14:24
quelle
2

Die Tatsache, dass Sie nichts sehen, hängt wahrscheinlich mit der Tatsache zusammen, dass eine Pufferung stattfindet. Sie erhalten also nur alle 4 Ko von Text oder so.

stattdessen versuchen Sie etwas wie folgt:

%Vor%

Dann dekoriere sys.stdout mit dieser Klasse mit einem Code wie diesem:

%Vor%

Auf diese Weise wird jede Ausgabe ( print eingeschlossen) in die Standardausgabe und in die angegebene Datei geleert. Möglicherweise erfordern Optimierungen, weil ich diese Implementierung nicht getestet habe.

Natürlich sollten Sie beim Drucken von Nachrichten eine (meist geringe) Leistungseinbuße erwarten.

    
BatchyX 26.09.2010 13:45
quelle
1

Sie könnten versuchen, sys.stdout.flush() gelegentlich in Ihrem Skript auszuführen und erneut mit tee zu laufen. Wenn stdout bis tee umgeleitet wird, wird es möglicherweise länger gepuffert, als wenn es direkt zu einem Terminal geht.

    
Doug 26.09.2010 13:31
quelle

Tags und Links