Запись stdout Python в файл с активным 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 делает что-то отличное от простой записи байтов, которые он получает из стандартного вывода, в файл журнала, я попытался добавить encoding="UTF-8" к logging.FileHandler().

В результате '\x0D' больше не печатается, и вместо этого я получаю "\x0A\x00\x0A\x00". Это немного лучше, я думаю.

В Linux вроде с этим проблем нет. Я использую тот же скрипт, но вместо этого моя программа печатает UTF-8 символов.

(Здесь осталось два вопроса: почему Python добавляет еще одну новую строку? И можно ли регистрировать дополнительную информацию в файле журнала? Помещение «U» перед строками или использование «...». encode (UTF-16) не не работает, но в противном случае лог-файл будет содержать строки с разными кодировками и станет бесполезным...)

person user1169333    schedule 05.07.2012