8

我有一个使用logging模块和print语句的程序。日志记录是为了通知用户程序在做什么,例如

logging.info("downloading HTML")
time.sleep(1)
logging.info("parsing HTML")
time.sleep(1)
print "the result"

最后屏幕上的输出(混合标准输出和标准错误)将是:

INFO:downloading HTML
INFO:parsing HTML
the result

我想在显示下一个日志输出或调用 print 时隐藏最后一个日志输出。比如启动程序,你会看到:

INFO:download HTML

等待一秒钟,下一个信息"parsing HTML"将替换上一个"downloading HTML",所以在屏幕上你只会看到:

INFO:parsing HTML

之前没有别的,然后等待一秒钟,我只想在屏幕上看到:

"the result"

我仅在登录 stderr 时才需要此功能,而不是在登录到文件时,例如,我想查看所有logging输出。

是否可以?

4

1 回答 1

13

在类 unix 终端上,您可以尝试在文本前添加ANSI 转义序列;

import time
import sys

print 'this is a text',
sys.stdout.flush()

time.sleep(1)
print '\x1b[80D'+'\x1b[K'+'Second text',
sys.stdout.flush()

字符 '\x1b' 是转义字符。第一个序列将光标向左移动最多 80 个位置。第二个清除线路。

您需要在 print 语句的末尾加上逗号,以防止它进入第二行。然后你需要刷新stdout流,否则文本不会出现。

编辑:为了将其与日志记录结合起来,将其包装在一个简单的函数中:

def mylog(text):
    logging.info(text)
    print '\x1b[80D' + '\x1b[K'+ text,
    sys.stdout.flush()

编辑 2:将此集成到标准日志记录中;

import logging
# create console handler
ch = logging.StreamHandler()
# create formatter
formatter = logging.Formatter('\x1b[80D\x1b[1A\x1b[K%(message)s')
# add formatter to console handler
ch.setFormatter(formatter)
# add console handler to logger
logger.addHandler(ch)

由于日志记录模块本身似乎添加了换行符,因此我添加了一个 ANSI 序列 (\x1b[1A) 来增加一行。

另请参阅日志记录方法以获取更多信息。

于 2012-08-16T11:45:09.623 回答