在没有控制台日志处理器的情况下, logging_redirect_tqdm 出现错误
作者: schoennenbeck创建于 2023年8月21日更新于 2026年8月28日
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] linuxlogging_redirect_tqdm 旨在将所有给定日志器的所有控制台处理器的日志输出重定向到 tqdm.write。它通过(暂时)从给定日志器中移除所有控制台处理器并添加一个新的 tqdm-handler(其格式器继承自第一个找到的控制台日志处理器)来实现这一点。然而,如果原始日志器没有控制台日志处理器,则 tqdm-handler 仍然会被添加,这意味着日志器现在开始将输出写入控制台,而之前没有这样做。从我的角度来看,这是一个 bug,因为它并没有将控制台输出重定向到 tqdm.write,而是引入了之前不存在的新输出(此外,此行为也未在文档中说明)。
在 tqdm/tqdm/contrib/logging.py 中的相关代码目前为:
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 语句下方即可解决此问题(我们只在最初至少有一个控制台处理器时添加新的处理器)。
内容来源: tqdm/tqdm