2012-03-30 2 views
0

Итак, using this example, я регистрирую свой stdout в файле, а также отправляю его на терминал.Запуск Python stdout в файл ... с активным stdout (backspacing/update)

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

В любом случае, я мог бы записать «окончательное» состояние stdout сценария python?

+1

Можно ли использовать регулярное выражение для удаления непечатаемых символов с вывода, который вы отправляете в файл? –

+0

, но тогда я все еще вижу каждую итерацию обновления, но хорошая идея. – jondavidjohn

+1

Как оказалось, терминалы принципиально разные, чем плоские журналы файлов. Один из них предназначен для временного (и, следовательно, невидимого обновления); другой - это * журнал *. – Amber

ответ

1

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

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

Смежные вопросы