Seite 1 von 1

Schreiben von Stdout in ein File und an die Konsole

Verfasst: Dienstag 8. März 2005, 09:45
von leoel
Hallo!

Ich weiss nicht wir trivial oder kompliziert das ist, aber ich habe da mal eine Frage:

Ich habe ein nettes Script geschrieben, das jede Menge Prints macht. Ich würde gerne diese Prints in der Konsole darstellen UND auch in ein File schreiben.

Eine Möglichkeit wäre die Strings zuerst manuell zusammenzubasteln und einerseits mit write() in ein File zu schreiben und auch mit print auszugeben.

Jetzt wollte ich mal fragen, ob es möglich ist die Ausgabe an stdout (ich nehme mal an, dass das das print macht) so zu verteilen, dass die prints einerseits in der Konsole dargestellt werden UND eben auch in ein File geschrieben werden...

Umgebung: WinXP, Konsole: Das "gute" alte cmd.exe

Vielen Dank,
Leo

Verfasst: Dienstag 8. März 2005, 10:16
von CM
Hi

Dookie hat vor einiger Zeit ein Modul geschrieben, das als Zeilenpuffer fungiert und genau Dein Problem löst: http://python.sandtner.org/viewtopic.php?t=1922.

Gruß,
Christian

Verfasst: Dienstag 8. März 2005, 11:36
von leoel
Hallo CM!

Danke, das geht super!
Ich rufe zwar im Script per submodul ein externes Programm auf, dessen Ausgabe wird zwar nicht mitgeloggt, aber das ist nicht wirklich tragisch, weil da hab ich ohnehin das logfile dieses Programms

Vielen Dank
Leo

Verfasst: Dienstag 8. März 2005, 16:07
von rayo
Hi

Du könntest auch stdout durch eine eigene Klasse ersetzen.

Sowas in der Art (ungetestet):

Code: Alles auswählen

class LogOut:
    def __init__(self, stdout, logfile):
        self.stdout = stdout
        self.file = logfile
    def write(self, value):
        self.stdout.write(value)
        self.file.write(value)

log = file('log.txt','w')
sys.stdout = LogOut(sys.stdout,log)

...

log.close()
gruss

Verfasst: Dienstag 8. März 2005, 16:45
von CM
Hi

was Dookies Modul macht ist im Grunde genommen etwas was Deinem Vorschlag, rayo, nahe kommt oder sogar weit drüber hinaus geht. Man kann eben verschiedene Empfänger (stdout, ein File, noch ein File, stderr oder ein Stream sonstwohin) öffnen und in alle diese gleichzeitig schreiben. Das ist ja gerade das Tolle dran: Man muß nicht einen Empfänger gegen einen anderen austauschen und hat noch so ein paar zusätzliche Kontrollfunktionen drin.

Gruß,
Christian