TQDM嵌套进度条每次迭代生成新进度条问题求助
解决TQDM嵌套进度条重复打印新行的问题
问题描述
我正尝试实现描述随每次迭代更新的TQDM嵌套进度条,根据TQDM文档,应显示2条进度条(外层进度条和内层进度条),内层进度条完成100%后推进外层进度条的一定比例,再重新运行内层进度条。但我的代码中,无论是内层循环还是外层循环,每次迭代都会打印出全新的进度条行。
用户提供的代码:
import time from tqdm import tqdm def start_loop1(): with tqdm(total=10, desc = "Outer Loop", position=0, leave=True) as pbar1: for i in range(10): print ("working on outer iteration - {}".format(i)) pbar1.set_description("Outer Loop Iteration - {}".format(i)) pbar1.refresh() time.sleep(2) start_loop2() pbar1.update(1) def start_loop2(): with tqdm(total=5, desc = "Inner Loop", position=1, leave=True) as pbar2: for i in range(5): print ("working on inner iteration - {}".format(i)) pbar2.set_description("Inner Loop Iteration - {}".format(i)) pbar2.refresh() time.sleep(5) pbar2.update(1) pbar2.reset() #%% Standalone Run if __name__ == "__main__": start_loop1()
问题根源及修复方案
- print语句破坏进度条行内刷新:
print()会强制输出新行,打断tqdm的进度条行内更新逻辑,导致每次输出都新增一行。需替换为tqdm.write()方法,该方法会在不干扰进度条的区域输出日志。 - 内层进度条
leave参数错误:内层进度条设置leave=True会在完成后保留该行,下次运行时只能在新行创建进度条。应改为leave=False,让内层进度条完成后自动清除,下次复用同一行。 - 冗余的
refresh()调用:tqdm在update()或set_description()后会自动触发刷新,手动调用refresh()属于多余操作,可能引发异常。 - 不必要的
reset()操作:内层进度条使用with语句管理上下文,退出时会自动关闭进度条,reset()无需保留。
修改后的代码
import time from tqdm import tqdm def start_loop1(): with tqdm(total=10, desc="Outer Loop", position=0, leave=True) as pbar1: for i in range(10): # 用tqdm.write替代print,避免干扰进度条 pbar1.write(f"working on outer iteration - {i}") pbar1.set_description(f"Outer Loop Iteration - {i}") time.sleep(2) start_loop2() pbar1.update(1) def start_loop2(): # 内层leave设为False,完成后自动清除进度条 with tqdm(total=5, desc="Inner Loop", position=1, leave=False) as pbar2: for i in range(5): pbar2.write(f"working on inner iteration - {i}") pbar2.set_description(f"Inner Loop Iteration - {i}") time.sleep(5) pbar2.update(1) if __name__ == "__main__": start_loop1()
内容的提问来源于stack exchange,提问作者t.abraham
相关产品推荐
相关产品推荐

