You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tqdm与print/logging兼容问题:首条日志/打印无换行

解决tqdm进度条与print/logging的首行换行问题

问题原因

tqdm进度条通过终端回车符(\r)实现单行刷新,首次输出print或日志时,光标停留在进度条所在行的末尾,导致输出内容直接追加在进度条后,无法自动换行。

解决方案

1. 使用tqdm.write()替代直接print/logging

tqdm内置的write()方法专门用于在进度条旁输出内容,会自动处理光标位置和换行,避免与进度条冲突。

针对print场景:

from tqdm import tqdm

for i in tqdm(range(1000)):
    for _ in range(2000):
        a = i+8
    if i % 100 == 0:
        tqdm.write("test")

针对logging场景:

可以直接用tqdm.write()输出日志内容,或者封装成自定义日志处理器统一处理:

import logging
from tqdm import tqdm

# 自定义适配tqdm的日志处理器
class TqdmLoggingHandler(logging.Handler):
    def emit(self, record):
        try:
            msg = self.format(record)
            tqdm.write(msg)
            self.flush()
        except Exception:
            self.handleError(record)

# 替换默认日志处理器
logging.basicConfig(level=logging.WARNING)
for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)
logging.root.addHandler(TqdmLoggingHandler())

for i in tqdm(range(1000)):
    for _ in range(2000):
        a = i+8
    if i % 100 == 0:
        logging.warning("test")

2. 强制刷新输出缓冲区(仅适用于print场景)

通过设置print()的flush=True参数,配合tqdm默认的leave=False行为,也能解决首行换行问题:

from tqdm import tqdm

for i in tqdm(range(1000)):
    for _ in range(2000):
        a = i+8
    if i % 100 == 0:
        print("test", flush=True)

效果验证

使用上述方法后,输出会变为:

0%|          | 0/1000 [00:00<?, ?it/s]
test
test
...
100%|██████████| 1000/1000 [00:00<00:00, xxxit/s]

首条输出会自动换行,不会与进度条挤在同一行,后续输出也不会出现多余换行。

内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:21:10