好的,using this example,我正在将stdout记录到文件中,并将其发送到终端。
但是,当我查看日志文件时,不会处理退格,而是与输出一起打印。
任何方式我都可以记录python脚本的stdout的“最终”状态?
答案 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)不起作用。但是否则日志文件将包含不同编码的字符串并变得无用......)