将日志记录“打印”功能更改为“tqdm.write”,以便日志记录不会干扰进度条

新手上路,请多包涵

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

原文由 Guillochon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

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

 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 Exception:
            self.handleError(record)

然后将其添加到日志记录链中:

 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)

编辑:修复了调用 super TqdmLoggingHandler 的 init 方法时的错误,勤奋的读者@BlaineRogers 在评论中指出了这一点。 (如果有人想进一步了解 Python 的这个阴暗区域,我推荐 https://fuhm.net/super-harmful/

原文由 RolKau 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

从 tqdm 文档 复制

原文由 thomaskeefe 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题