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
相关产品推荐
相关产品推荐

