将"print"功能更改为"tqdm.write",以便日志记录不会干扰进度条

Gui*_*hon 13 python logging tqdm

我有一个简单的问题:如何将内置的Python记录器的print功能更改为tqdm.write使得记录消息不会干扰tqdm的进度条?谢谢!

tho*_*efe 67

tqdm现在有一个内置的上下文管理器用于重定向记录器:

import logging
from tqdm import trange
from tqdm.contrib.logging import logging_redirect_tqdm

LOG = logging.getLogger(__name__)

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    with logging_redirect_tqdm():
        for i in trange(9):
            if i == 4:
                LOG.info("console logging redirected to `tqdm.write()`")
    # logging restored
Run Code Online (Sandbox Code Playgroud)

从 tqdm 文档复制

  • 从以上所有答案中。只有这个有效。应标记为已接受。 (3认同)
  • 如果您为“LOG”设置了自己的格式化程序,那么您应该执行“logging_redirect_tqdm(loggers=[LOG])”。这将导致 `tqdm` 使用 `LOG` 的格式化程序。 (3认同)

Rol*_*Kau 22

您需要一个自定义日志处理程序

import logging
import tqdm

class TqdmLoggingHandler(logging.Handler):
    def __init__(self, level=logging.NOTSET):
        super().__init__(level)

    def emit(self, record):
        try:
            msg = self.format(record)
            tqdm.tqdm.write(msg)
            self.flush()
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            self.handleError(record)  
Run Code Online (Sandbox Code Playgroud)

然后将其添加到日志链:

import time

log = logging.getLogger (__name__)
log.setLevel (logging.INFO)
log.addHandler (TqdmLoggingHandler ())
for i in tqdm.tqdm (range (100)):
    if i == 50:
        log.info ("Half-way there!")
    time.sleep (0.1)
Run Code Online (Sandbox Code Playgroud)

编辑:修复了对超级TqdmLoggingHandler的init方法的调用中的错误,这是由努力的读者@BlaineRogers在评论中指出的.(如果有人想进一步阅读这个关于Python的阴暗区域,我推荐https://fuhm.net/super-harmful/)