Python progressbar进度显示异常:先满格再执行程序求助
问题根源分析
你遇到的问题核心是进度条的更新循环和实际任务的执行完全脱节了!
看一下你现在的代码逻辑:
- 先计算当前文件的行数作为进度条的总步数
- 启动进度条后,你用一个
for循环把所有进度条更新操作(bar.update(i+1))全部跑完了,中间只加了sleep(0.1)模拟耗时,但这根本不是你的实际任务 - 等这个进度条循环彻底跑完(进度到100%),程序才会往下执行你真正的训练/计算代码——这就是为什么你看到进度条满了之后才出现print输出和训练启动的原因。
修正方案
你需要把进度条的更新和实际任务的每一步执行绑定在一起,而不是单独跑一个空的进度条循环。举个例子,假设你的实际任务是逐行处理文件内容,修正后的代码应该是这样的:
import os import progressbar from time import sleep def file_len(fname): with open(fname) as f: for i, l in enumerate(f): pass return i + 1 # 获取总任务数(这里还是用文件行数举例,实际要换成你的任务总步数) total_tasks = file_len(os.path.basename(__file__)) # 初始化进度条 bar = progressbar.ProgressBar( maxval=total_tasks, widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()] ) bar.start() # 把实际任务和进度条更新放在同一个循环里 with open(os.path.basename(__file__)) as f: for i, line in enumerate(f): # ---------------------- # 这里写你的实际任务代码:比如处理该行内容、训练迭代、计算步骤等 print(f"执行第{i+1}步任务...") # 示例任务输出 sleep(0.1) # 模拟任务耗时(实际替换成你的任务逻辑) # ---------------------- # 每完成一个任务步骤,更新一次进度条 bar.update(i+1) bar.finish()
关键注意点
- 进度条的
maxval必须和实际任务的总步数匹配:比如如果是训练100个epoch,maxval就设为100,而不是随便找一个数值 - 进度条更新必须紧跟在单个任务步骤完成后:确保进度条的进度和实际任务的完成度完全同步
- 绝对不要单独跑一个空的进度条循环,那只是在“假装”任务在执行,完全起不到进度监控的作用
内容的提问来源于stack exchange,提问作者Fish1996
相关产品推荐
相关产品推荐

