必须安装 tqdm[notebook] 扩展包才能在 jupyter notebook 中正常使用进度条,仅安装基础版会导致乱码、跳动或报错;需用 pip install "tqdm[notebook]"(引号不可省),重启内核后导入 from tqdm.notebook import tqdm。

直接装 tqdm[notebook],别只装基础版
在 Jupyter Notebook 里用 tqdm,光执行 pip install tqdm 是不够的——它默认走的是终端模式,Notebook 里会显示乱码、进度条跳动、甚至报 UnicodeEncodeError 或根本不动。真正起作用的是带 notebook 支持的扩展包。
运行这行命令即可:
pip install "tqdm[notebook]"
注意引号不能省,否则 shell 可能把方括号当通配符解析。装完后重启 Jupyter 内核(Kernel → Restart),否则旧导入缓存可能让 from tqdm.notebook import tqdm 失效。
- 如果已装过基础版
tqdm,pip install --upgrade "tqdm[notebook]"会自动覆盖并补全依赖 - 国内用户建议加清华源:
pip install "tqdm[notebook]" -i https://pypi.tuna.tsinghua.edu.cn/simple - 装完验证:在 Notebook 单元格里运行
from tqdm.notebook import tqdm不报错,就算成功
from tqdm.notebook import tqdm 是 Notebook 的正确导入方式
别用 from tqdm import tqdm ——它在 Notebook 里大概率 fallback 到终端渲染,导致进度条闪烁或卡住。必须显式导入 notebook 子模块。
最简可用示例:
from tqdm.notebook import tqdm<br>from time import sleep<br><br>for i in tqdm(range(50)):<br> sleep(0.05)
这样才会渲染成 Jupyter 原生的 HTML 进度条,支持动态更新、不刷屏、能正常响应中断(Ctrl+C)。
- 如果你用的是旧版 Jupyter(ipywidgets:
pip install ipywidgets,然后在 Notebook 里运行jupyter nbextension enable --py widgetsnbextension - 新版 JupyterLab(3.0+)通常自带 widget 支持,但若进度条空白,先检查浏览器控制台有没有
widget not found报错
遇到 ValueError: expected at most 1 arguments, got 2 怎么办
这个错误几乎全是因混用导入方式导致的:你在 Notebook 里写了 from tqdm import tqdm,又传了 notebook=True 参数,比如 tqdm(range(10), notebook=True)。但基础版 tqdm 根本不认这个参数。
两种解法任选其一:
- 删掉
notebook=True,改用from tqdm.notebook import tqdm(推荐) - 或者坚持用基础导入,就别传
notebook参数,改用from tqdm import tqdm+tqdm(..., file=sys.stdout)强制输出到 stdout(效果差,不推荐)
顺带提醒:tqdm.auto 模块会自动检测环境并选 notebook 或 terminal 版本,但它的自动判断有时不准,尤其在远程 Jupyter 或 VS Code Remote 场景下,反而容易出错。不如手动指定来得稳。
训练循环里嵌套进度条,别忘了 leave=False
PyTorch 或 sklearn 训练时常见两层循环:外层 epoch,内层 batch。如果都用默认 tqdm,内层进度条结束后会保留一行,几轮下来满屏都是“100%|██████| 100/100 [00:02
标准写法是外层留、内层不留:
from tqdm.notebook import tqdm<br><br>for epoch in tqdm(range(10), desc="Epoch"):<br> # 内层 batch 进度条不保留,避免堆积<br> for batch in tqdm(dataloader, desc="Batch", leave=False):<br> train_step(batch)
leave=False 是关键——它让内层进度条完成即消失,只在外层显示当前 epoch 进度。漏掉这个参数,调试时翻页都费劲。
另外,desc 参数别空着,它能让多层进度条语义清晰;而 unit="batch" 或 unit="step" 比默认的 "it" 更准确,尤其在 batch size 动态变化时。











