tqdm - PyCharm 中带有嵌套 for 循环的多个进度条

lea*_*ner 20 python pycharm tqdm

下面的问题是针对使用 PyCharm 的人。\n有嵌套for循环,tqdm用于与每个for循环对应的进度条。代码如下所示。

\n
from tqdm import tqdm\nimport time\n\nfor i in tqdm(range(5), desc="i", colour='green'):\n    for j in tqdm(range(10), desc="j", colour='red'):\n        time.sleep(0.5)\n
Run Code Online (Sandbox Code Playgroud)\n

但问题是,每次进度条中有更新时,内部循环的进度条都会以换行符显示,如下所示。

\n
i:   0%|          | 0/5 [00:00<?, ?it/s]\nj:   0%|          | 0/10 [00:00<?, ?it/s]\nj:  10%|\xe2\x96\x88         | 1/10 [00:00<00:04,  1.94it/s]\nj:  20%|\xe2\x96\x88\xe2\x96\x88        | 2/10 [00:01<00:04,  1.94it/s]\nj:  30%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88       | 3/10 [00:01<00:03,  1.96it/s]\nj:  40%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88      | 4/10 [00:02<00:03,  1.96it/s]\nj:  50%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88     | 5/10 [00:02<00:02,  1.97it/s]\nj:  60%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88    | 6/10 [00:03<00:02,  1.97it/s]\nj:  70%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88   | 7/10 [00:03<00:01,  1.97it/s]\nj:  80%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88  | 8/10 [00:04<00:01,  1.98it/s]\nj:  90%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88 | 9/10 [00:04<00:00,  1.98it/s]\nj: 100%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88| 10/10 [00:05<00:00,  1.98it/s]\ni:  20%|\xe2\x96\x88\xe2\x96\x88        | 1/5 [00:05<00:20,  5.06s/it]\nj:   0%|          | 0/10 [00:00<?, ?it/s]\nj:  10%|\xe2\x96\x88         | 1/10 [00:00<00:04,  2.00it/s]\nj:  20%|\xe2\x96\x88\xe2\x96\x88        | 2/10 [00:01<00:04,  1.99it/s]\nj:  30%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88       | 3/10 [00:01<00:03,  1.99it/s]\nj:  40%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88      | 4/10 [00:02<00:03,  1.99it/s]\nj:  50%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88     | 5/10 [00:02<00:02,  1.99it/s]\nj:  60%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88    | 6/10 [00:03<00:02,  1.99it/s]\nj:  70%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88   | 7/10 [00:03<00:01,  1.99it/s]\nj:  80%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88  | 8/10 [00:04<00:01,  1.99it/s]\nj:  90%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88 | 9/10 [00:04<00:00,  1.99it/s]\nj: 100%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88| 10/10 [00:05<00:00,  1.99it/s]\ni:  40%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88      | 2/5 [00:10<00:15,  5.05s/it]\n\n
Run Code Online (Sandbox Code Playgroud)\n

为每个循环设置参数“position”也不能解决问题。

\n
from tqdm import tqdm\nimport time\n\nfor i in tqdm(range(5), desc="i", colour='green', position=0):\n    for j in tqdm(range(10), desc="j", colour='red', position=1):\n        time.sleep(0.5)\n
Run Code Online (Sandbox Code Playgroud)\n

如何让进度条在同一行更新?

\n

lea*_*ner 29

解决方案有两个方面。

\n
    \n
  1. 转到“编辑配置”。单击正在使用的运行/调试配置。应该有一个选项“在输出控制台中模拟终端”。检查一下。添加图像以供参考。\n在此输入图像描述

    \n
  2. \n
  3. 随着position参数也设置leave参数。代码应该如下所示。我已添加,ncols以便进度条不会占据整个控制台。

    \n
  4. \n
\n
from tqdm import tqdm\nimport time\n\nfor i in tqdm(range(5), position=0, desc="i", leave=False, colour=\'green\', ncols=80):\n    for j in tqdm(range(10), position=1, desc="j", leave=False, colour=\'red\', ncols=80):\n        time.sleep(0.5)\n
Run Code Online (Sandbox Code Playgroud)\n

现在运行代码时,控制台的输出如下所示。

\n
i:  20%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x8d                                 | 1/5 [00:05<00:20,  5.10s/it]\nj:  60%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x8c                | 6/10 [00:03<00:02,  1.95it/s]\n\n
Run Code Online (Sandbox Code Playgroud)\n

更新发生在同一行上。

\n

  • 不幸的是,使用 ssh 解释器时此复选框不存在 (2020.3) (4认同)

Nis*_*sba 5

这是一个也适用于 PyCharm SSH 解释器的解决方案(我使用的是 2021.3.1(专业版),并且没有“在输出控制台中模拟终端”选项):

from tqdm.auto import tqdm

for i in tqdm(range(10), position=0, leave=True):
    for index in tqdm(range(10), position=0, leave=True):
        pass
Run Code Online (Sandbox Code Playgroud)