使用活动标准输出(退格/更新)将Python标准输出记录到文件...

时间:2012-03-30 16:37:05

标签: python logging stdout

好的,using this example,我正在将stdout记录到文件中,并将其发送到终端。

但是,当我查看日志文件时,不会处理退格,而是与输出一起打印。

任何方式我都可以记录python脚本的stdout的“最终”状态?

2 个答案:

答案 0 :(得分: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!

请注意,通常您应该使用原始字符串文字作为正则表达式,这是您不应该使用的极少数情况之一。

答案 1 :(得分: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)不起作用。但是否则日志文件将包含不同编码的字符串并变得无用......)