含continue语句的for循环中tqdm进度条不显示的原因及解决
tqdm进度条在含continue的循环中不显示的问题解决
问题原因
tqdm的进度条依靠终端光标位置控制实现——它会在同一行不断覆盖旧内容展示进度。当循环中有print()时,print()会输出换行符,将光标移至下一行,tqdm会自动在新行重新绘制进度条;但在前5次迭代执行continue跳过print()时,没有触发换行操作,且tqdm的默认更新逻辑依赖输出动作触发终端刷新,导致进度条的更新被终端缓冲,无法及时显示。
另外,tqdm默认将进度条输出到stderr流,而print()输出到stdout流,两个流的刷新时机不同,没有print()的情况下,stderr的进度条更新可能不会被立即渲染。
解决方法
方法1:手动刷新进度条
将tqdm实例化,在每次迭代(包括执行continue的情况)中手动调用refresh()强制刷新进度条:
import time from tqdm import tqdm # 实例化进度条对象 pbar = tqdm(range(10)) for i in pbar: time.sleep(1) if i < 5: # 强制刷新进度条 pbar.refresh() continue print(' '*5 + str(i))
方法2:让tqdm和print使用同一输出流
将tqdm的输出流设置为stdout(和print()一致),这样tqdm会自动处理进度条和打印内容的显示:
import time import sys from tqdm import tqdm for i in tqdm(range(10), file=sys.stdout): time.sleep(1) if i < 5: continue print(' '*5 + str(i))
方法3:调整tqdm的更新间隔
设置mininterval=0,让tqdm忽略最小更新间隔,立即渲染进度条:
import time from tqdm import tqdm for i in tqdm(range(10), mininterval=0): time.sleep(1) if i < 5: continue print(' '*5 + str(i))
内容的提问来源于stack exchange,提问作者Swike
相关产品推荐
相关产品推荐

