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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:42:25