我正在使用tqdm在Jupyter笔记本上运行的脚本中打印进度。我正在通过tqdm.write()将所有消息打印到控制台。然而,这仍然给我一个倾斜的输出,如下所示:
也就是说,每当需要打印新的一行时,下一行就会打印一个新的进度条。当我通过终端运行脚本时,这不会发生。我怎么解决这个问题?
我正在使用tqdm在Jupyter笔记本上运行的脚本中打印进度。我正在通过tqdm.write()将所有消息打印到控制台。然而,这仍然给我一个倾斜的输出,如下所示:
也就是说,每当需要打印新的一行时,下一行就会打印一个新的进度条。当我通过终端运行脚本时,这不会发生。我怎么解决这个问题?
当前回答
使用Python 3.9.2和tqdm==4.62.3:
from tqdm.notebook import tqdm
for item in tqdm(list_of_items):
do_something(item)
其他回答
这是tqdm_notebook不适用于您的情况的另一种答案。
给出如下示例:
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values)) as pbar:
for i in values:
pbar.write('processed: %d' %i)
pbar.update(1)
sleep(1)
输出看起来像这样(进度显示为红色):
0%| | 0/3 [00:00<?, ?it/s]
processed: 1
67%|██████▋ | 2/3 [00:01<00:00, 1.99it/s]
processed: 2
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
processed: 3
问题在于stdout和stderr的输出是异步处理的,并且是根据新行分开处理的。
假设Jupyter在stderr上接收第一行,然后在stdout上接收“处理过的”输出。然后,一旦它在stderr上接收到更新进度的输出,它就不会返回去更新第一行,因为它只会更新最后一行。相反,它将不得不编写新的一行。
解决方案1,写入标准输出
一种解决方法是将两者都输出到stdout:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.write('processed: %d' % (1 + i))
pbar.update(1)
sleep(1)
输出将变为(不再是红色):
processed: 1 | 0/3 [00:00<?, ?it/s]
processed: 2 | 0/3 [00:00<?, ?it/s]
processed: 3 | 2/3 [00:01<00:00, 1.99it/s]
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
在这里,我们可以看到木星似乎直到这条线的尽头才被清除。我们可以通过添加空格来添加另一种解决方法。如:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.write('processed: %d%s' % (1 + i, ' ' * 50))
pbar.update(1)
sleep(1)
这给了我们:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
解决方案2,改为设置描述
一般来说,不包含两个输出,而是更新描述可能会更直接,例如:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.set_description('processed: %d' % (1 + i))
pbar.update(1)
sleep(1)
输出(描述在处理过程中更新):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
结论
您可以使用普通的tqdm使其正常工作。但是如果tqdm_notebook适合您,那么就使用它(但这样您可能读不到那么远)。
对于每个人谁是在窗口,不能解决复制条的问题与任何解决方案在这里提到。我不得不安装colorama包,因为tqdm的已知问题已经解决了。
pip install colorama
试试下面这个例子:
from tqdm import tqdm
from time import sleep
for _ in tqdm(range(5), "All", ncols = 80, position = 0):
for _ in tqdm(range(100), "Sub", ncols = 80, position = 1, leave = False):
sleep(0.01)
这将产生如下内容:
All: 60%|████████████████████████ | 3/5 [00:03<00:02, 1.02s/it]
Sub: 50%|██████████████████▌ | 50/100 [00:00<00:00, 97.88it/s]
使用Python 3.9.2和tqdm==4.62.3:
from tqdm.notebook import tqdm
for item in tqdm(list_of_items):
do_something(item)
TQDM自动加载合适的进度条,无论是普通代码或交互环境通过
from tqdm.auto import tqdm
使用tqdm_notebook
from tqdm import tqdm_notebook as tqdm
x=[1,2,3,4,5]
for i in tqdm(range(0,len(x))):
print(x[i])