在PyCharm中使用tqdm实现嵌套for循环的多个进度条

20

以下问题适用于使用 PyCharm 的人。 存在嵌套的 for 循环,并且对于每个 for 循环都使用了 tqdm 来显示进度条。代码如下所示。

from tqdm import tqdm
import time

for i in tqdm(range(5), desc="i", colour='green'):
    for j in tqdm(range(10), desc="j", colour='red'):
        time.sleep(0.5)

但问题是,每当进度条更新时,内部循环的进度条都会出现在新行中,如下所示。

i:   0%|          | 0/5 [00:00<?, ?it/s]
j:   0%|          | 0/10 [00:00<?, ?it/s]
j:  10%|█         | 1/10 [00:00<00:04,  1.94it/s]
j:  20%|██        | 2/10 [00:01<00:04,  1.94it/s]
j:  30%|███       | 3/10 [00:01<00:03,  1.96it/s]
j:  40%|████      | 4/10 [00:02<00:03,  1.96it/s]
j:  50%|█████     | 5/10 [00:02<00:02,  1.97it/s]
j:  60%|██████    | 6/10 [00:03<00:02,  1.97it/s]
j:  70%|███████   | 7/10 [00:03<00:01,  1.97it/s]
j:  80%|████████  | 8/10 [00:04<00:01,  1.98it/s]
j:  90%|█████████ | 9/10 [00:04<00:00,  1.98it/s]
j: 100%|██████████| 10/10 [00:05<00:00,  1.98it/s]
i:  20%|██        | 1/5 [00:05<00:20,  5.06s/it]
j:   0%|          | 0/10 [00:00<?, ?it/s]
j:  10%|█         | 1/10 [00:00<00:04,  2.00it/s]
j:  20%|██        | 2/10 [00:01<00:04,  1.99it/s]
j:  30%|███       | 3/10 [00:01<00:03,  1.99it/s]
j:  40%|████      | 4/10 [00:02<00:03,  1.99it/s]
j:  50%|█████     | 5/10 [00:02<00:02,  1.99it/s]
j:  60%|██████    | 6/10 [00:03<00:02,  1.99it/s]
j:  70%|███████   | 7/10 [00:03<00:01,  1.99it/s]
j:  80%|████████  | 8/10 [00:04<00:01,  1.99it/s]
j:  90%|█████████ | 9/10 [00:04<00:00,  1.99it/s]
j: 100%|██████████| 10/10 [00:05<00:00,  1.99it/s]
i:  40%|████      | 2/5 [00:10<00:15,  5.05s/it]

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

from tqdm import tqdm
import time

for i in tqdm(range(5), desc="i", colour='green', position=0):
    for j in tqdm(range(10), desc="j", colour='red', position=1):
        time.sleep(0.5)

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

2个回答

29
解决方案有两个步骤:
  1. 转到“编辑配置”。单击正在使用的运行/调试配置。应该会有一个选项“在输出控制台中模拟终端”。请勾选它。参考图片如下。 enter image description here

  2. 除了 position 参数之外,还要设置 leave 参数。代码应该如下所示。我添加了 ncols,以便进度条不会占满整个控制台。

from tqdm import tqdm
import time

for i in tqdm(range(5), position=0, desc="i", leave=False, colour='green', ncols=80):
    for j in tqdm(range(10), position=1, desc="j", leave=False, colour='red', ncols=80):
        time.sleep(0.5)
当现在运行代码时,控制台的输出如下所示。
i:  20%|████████▍                                 | 1/5 [00:05<00:20,  5.10s/it]
j:  60%|████████████████████████▌                | 6/10 [00:03<00:02,  1.95it/s]

更新发生在同一行。


4
很遗憾,在使用 SSH 解释器 (2020.3) 时,这个复选框不存在。 - cr0
1
@cr0,这个问题已经在这里提出。开发人员需要提供这个选项。 - learner
@cr0,请看看我的回答。 - Nisba
2022年的IDEA/PyCharm插件中,没有任何解决方案可用(选项模拟终端缺失;尝试了所有Leave、Position、tqdm和tqdm.auto的组合)。 - stam
对我来说很有效:使用PyCharm 2022.3.3(社区版):右键单击要运行的.py文件,选择“修改运行配置...”:它会打开一个窗口,在窗口中向下滚动到“执行”部分,你会找到“在输出控制台中模拟终端”。 - MarcoS

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接