Регистриране на Python stdout във файл с активен stdout (backspace/актуализиране)

Добре, така че използвайки този пример, регистрирам своя stdout във файл, както и го изпращам към терминала.

Но когато гледам регистрационния файл, интервалите назад не се обработват, а се отпечатват заедно с изхода.

Някакъв начин мога да регистрирам "крайното" състояние на stdout на скрипт на python?


person jondavidjohn    schedule 30.03.2012    source източник
comment
Можете ли да използвате регулярен израз, за ​​да премахнете непечатаемите знаци от изхода, който изпращате към файла?   -  person Some programmer dude    schedule 30.03.2012
comment
но след това все още виждам всяка итерация на актуализация, добра идея обаче.   -  person jondavidjohn    schedule 30.03.2012
comment
Както се оказва, терминалите са коренно различни неща от плоските регистрационни файлове. Единият е проектиран да бъде временен (и по този начин невидимо актуализиран); другият е проектиран да бъде дневник.   -  person Amber    schedule 30.03.2012


Отговори (2)


Ето решение, което взема основния клас от отговора, който сте свързали, и добавя обработка на регулярни изрази за \r и \b:

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!"

Примерно изпълнение:

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

Имайте предвид, че обикновено трябва да използвате необработени низови литерали за вашите регулярни изрази, това е един от редките случаи, в които не трябва.

person Andrew Clark    schedule 30.03.2012

Използвам функцията за регистриране на Python и имах същия проблем, че преобразува правилната последователност в края на реда "\x0D\x00\x0A\x00" в "\x0D\x0A\x00".

Изходът на програмата, който искам да регистрирам чрез Python, е UTF-16, както можете да видите.

За да избегна, че Python прави нещо различно от просто писане на байтовете, които получава от stdout, в лог файла, се опитах да добавя encoding="UTF-8" към logging.FileHandler().

Резултатът е, че „\x0D“ вече не се отпечатва и вместо това получавам „\x0A\x00\x0A\x00“. Това е малко по-добре, предполагам.

На Linux изглежда, че няма проблем с това. Използвам същия скрипт там, но програмата ми отпечатва UTF-8 знака вместо това.

(Тук остават два въпроса: Защо Python добавя още един нов ред? И възможно ли е да регистрирате допълнителна информация в регистрационния файл? Поставянето на 'U' преди низове или използването на "...".encode(UTF-16) не т работи. Но в противен случай лог-файлът ще съдържа низове с различни кодировки и ще стане безполезен...)

person user1169333    schedule 05.07.2012