2012-03-30 7 views
0

Ok, also using this example, ich logge mein stdout in eine Datei und sende es an das Terminal.Python stdout auf Datei protokollieren ... mit aktivem stdout (rücksetzen/aktualisieren)

Aber wenn ich auf die Protokolldatei schaue, werden die Backspaces nicht verarbeitet, sondern zusammen mit der Ausgabe gedruckt.

Irgendwie könnte ich den "endgültigen" Zustand von stdout eines Python-Skripts protokollieren?

+1

Können Sie einen Regex verwenden, um die nicht druckbaren Zeichen von der Ausgabe, die Sie an die Datei senden, zu entfernen? –

+0

aber dann sehe ich immer noch jede Update-Iteration, gute Idee. – jondavidjohn

+1

Wie sich herausstellt, sind Terminals grundsätzlich andere Dinge als flache Dateiprotokolle. Man ist entworfen, um vorübergehend zu sein (und folglich unsichtbar aktualisierbar); der andere ist als * log * konzipiert. – Amber

Antwort

1

Hier ist eine Lösung, die die Basisklasse aus der Antwort führt für \r und \b einige regex Handhabung verknüpft und ergänzt:

import sys 
import re 

class Logger(object): 
    def __init__(self, filename="Default.log"): 
     self.terminal = sys.stdout 
     self.log = open(filename, "a") 
     self.cr_pattern = re.compile("^.*\r", re.M) 
     self.bs_pattern = re.compile(".\b") 

    def write(self, message): 
     self.terminal.write(message) 
     message = self.bs_pattern.sub('', self.cr_pattern.sub('', message)) 
     self.log.write(message) 

sys.stdout = Logger("yourlogfilename.txt") 
print "Hello\rGoodbyee\b world!" 

Beispiel laufen:

$ python test.py 
Goodbye world! 
$ cat yourlogfilename.txt 
Goodbye world! 

Beachten Sie, dass normalerweise sollten Sie Verwenden Sie reine Zeichenfolgenliterale für Ihre regulären Ausdrücke. Dies ist einer der seltenen Fälle, in denen Sie dies nicht tun sollten.

0

Ich benutze die Protokollierung von Python und hatte das gleiche Problem, dass es die korrekte Zeilenende-Sequenz "\x0D\x00\x0A\x00" in "\x0D\x0A\x00" umwandelt. Die Programmausgabe, die ich über Python protokollieren möchte, ist UTF-16, wie Sie sehen können.

Um zu vermeiden, dass Python nichts anderes tut als nur die Bytes zu schreiben, die es von stdout in die Logdatei bekommt, habe ich versucht, zu logging.FileHandler() hinzuzufügen. Das Ergebnis ist, dass '\x0D' nicht mehr gedruckt wird und stattdessen "\x0A\x00\x0A\x00" angezeigt wird. Das ist ein bisschen besser, denke ich.

Unter Linux scheint es, dass es kein Problem damit gibt. Ich benutze das gleiche Skript dort, aber mein Programm druckt stattdessen UTF-8 Zeichen.

(Es gibt zwei Fragen hier: Warum fügt Python einen weiteren Zeilenumbruch hinzu? Und ist es möglich, zusätzliche Informationen in das Logfile zu schreiben? Setzen Sie ein 'U' vor Zeichenfolgen oder verwenden Sie "...". Encode (UTF- 16) funktioniert nicht, aber ansonsten enthält das Logfile Zeichenketten verschiedener Codierungen und wird unbrauchbar ...)