Запись Python stdout в файл ... с активным stdout (возврат / обновление) - PullRequest
0 голосов
/ 30 марта 2012

Хорошо, поэтому используя этот пример , я записываю свой стандартный вывод в файл и отправляю его на терминал.

Но когда я смотрю на файл журнала, возвраты не обрабатываются, а выводятся вместе с выводом.

Каким образом я могу записать "окончательное" состояние стандартного вывода скрипта Python?

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Вот решение, которое берет базовый класс из ответа, который вы связали, и добавляет некоторую обработку регулярных выражений для \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!

Обратите внимание, что обычно вы должны использовать необработанные строковые литералы для регулярных выражений, это один из редких случаев, когда вы не должны.

0 голосов
/ 05 июля 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) не работает. Но в противном случае файл журнала будет содержать строки разных кодировок и станет бесполезным ...)

...