Seite 1 von 1

Logging von stdout und stdin

Verfasst: Dienstag 7. Juni 2005, 19:57
von etienne77
Hallo,

ist es möglich den stdout und stdin sowohl am promt als auch gleichzeitg in eine Datei wegzuschreiben?
Falls in Python nicht geht: Besteht da eine Möglichkeit über die Windows cmd am prompt ein bzw ausgaben zumachen und gleichzeitg die Ein und Ausgaben in ein File zu loggen.

Ciao
Stefan

Verfasst: Dienstag 7. Juni 2005, 21:17
von jens
Das geht in Python selber...
Man modifiert einfach sys.stdout...

Ungefähr so:

Code: Alles auswählen

import sys

class Redirectstdout:
    def __init__(self):
        self.Meinstdout = sys.stdout
        self.outfile = file( "ausgaben.txt" )

    def write(self,*text):
        text=" ".join([str(i) for i in text])
        
        self.outfile.write( text )

        self.Meinsys.stdout.write(text)
        
    def close( self ):
        self.outfile.close()

sys.stdout = Redirectstdout()

Verfasst: Dienstag 7. Juni 2005, 21:34
von CM
Hallo Stefan,

So als Ergänzung zu Jens Vorschlag: Dookies Linebuffermodul ist wahrscheinlich der Overkill für Deine Anwendung. Aber ich habe es lieben gelernt. Und vielleicht findest Du da auch noch die eine oder andere Anwendung.

Gruß,
Christian

Verfasst: Sonntag 12. Juni 2005, 18:27
von Gast
Hallo,

danke für die Hilfe.

@jens
deni Skript produziert bei mir ein IO Error:

Code: Alles auswählen

 File "E:\temp\Redirectstdout.py", line 10, in write
    self.outfile.write( text )
IOError: (0, 'Error')

Die Datei zum Logging ist vorhanden! Steckt in deinem Skript noch ein Fehler?

Ciao
Stefan

Verfasst: Sonntag 12. Juni 2005, 19:52
von jens
Die Datei muß explizit zum schreiben geöffnet werden, denke ich...

Also so:

Code: Alles auswählen

import sys

class Redirectstdout:
    def __init__(self):
        self.Meinstdout = sys.stdout
        self.outfile = file( "ausgaben.txt", "w" ) # oder "a" für append/anhängen!

    def write(self,*text):
        text=" ".join([str(i) for i in text])
       
        self.outfile.write( text )

        self.Meinsys.stdout.write(text)
       
    def close( self ):
        self.outfile.close()

sys.stdout = Redirectstdout()

Verfasst: Dienstag 14. Juni 2005, 17:44
von etienne77
Hallo Jens,

du hast noch ein kleinen verschreiber drin:
so tuts

Code: Alles auswählen

import sys

class Redirectstdout:
    def __init__(self):
        self.Meinstdout = sys.stdout
        self.outfile = file( r"e:\temp\ausgabe1.txt","a" )
        
        
    def write(self,*text):
        text=" ".join([str(i) for i in text])
        self.outfile.write( text )
        
        self.Meinstdout.write(text)
       
    def close( self ):
        self.outfile.close()
Danke nochmals

Ciao
Stefan

Verfasst: Dienstag 14. Juni 2005, 18:04
von jens
etienne77 hat geschrieben:du hast noch ein kleinen verschreiber drin:
:oops: war auch ungetestet ;)

etienne77 hat geschrieben:self.outfile = file( r"e:\temp\ausgabe1.txt","a" )
Das ist aber unschön! mit r markiert man eigentlich eine regular expression ;) Du könntest entweder "e:\\temp\\ausgabe1.txt" schreiben, oder einfach Linux-like: "e:/temp/ausgabe1.txt", was auch unter Windows funktioniert ;)

Verfasst: Dienstag 14. Juni 2005, 18:49
von Leonidas
jens hat geschrieben:Das ist aber unschön! mit r markiert man eigentlich eine regular expression ;)
Nein, das ist meines Erachtens ganz in Ordnung, r"" sind ja raw-Strings, nicht Regex-Strings, somit kann man die Auch nutzen um Pfade zu speichern (okay, mit os.path arbeiten wäre vermutlich sauberer).