#1501·tqdm

在没有控制台日志处理器的情况下, logging_redirect_tqdm 出现错误

作者: schoennenbeck创建于 2023年8月21日更新于 2026年8月28日
  • 我已经标记了所有适用的类别:
    • 导致异常的错误
    • 视觉输出错误
  • 我已经访问了 源网站, 并特别阅读了 已知问题
  • 我已经在 问题跟踪器 中搜索重复的问题
  • 我已经提到了版本号、操作系统和环境, 如适用:
python
import tqdm, sys
print(tqdm.__version__, sys.version, sys.platform)
# 4.66.1 3.10.12 (main, Jul  5 2023, 18:54:27) [GCC 11.2.0] linux

logging_redirect_tqdm 旨在将所有给定日志器的所有控制台处理器的日志输出重定向到 tqdm.write。它通过(暂时)从给定日志器中移除所有控制台处理器并添加一个新的 tqdm-handler(其格式器继承自第一个找到的控制台日志处理器)来实现这一点。然而,如果原始日志器没有控制台日志处理器,则 tqdm-handler 仍然会被添加,这意味着日志器现在开始将输出写入控制台,而之前没有这样做。从我的角度来看,这是一个 bug,因为它并没有将控制台输出重定向到 tqdm.write,而是引入了之前不存在的新输出(此外,此行为也未在文档中说明)。

tqdm/tqdm/contrib/logging.py 中的相关代码目前为:

python
for logger in loggers:
    tqdm_handler = _TqdmLoggingHandler(tqdm_class)
    orig_handler = _get_first_found_console_logging_handler(logger.handlers)
    if orig_handler is not None:
        tqdm_handler.setFormatter(orig_handler.formatter)
        tqdm_handler.stream = orig_handler.stream
    logger.handlers = [
        handler for handler in logger.handlers
        if not _is_console_logging_handler(handler)] + [tqdm_handler]

只需将 logger.handlers = [...] 的缩进级别调整到 if 语句下方即可解决此问题(我们只在最初至少有一个控制台处理器时添加新的处理器)。