Schreiben von Stdout in ein File und an die Konsole

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
leoel
User
Beiträge: 36
Registriert: Dienstag 25. Mai 2004, 08:54
Wohnort: Graz

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
leoel
User
Beiträge: 36
Registriert: Dienstag 25. Mai 2004, 08:54
Wohnort: Graz

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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Antworten