Jupyter Notebook 中的 tqdm 重复打印新进度条

问题描述 投票:0回答:13

我正在使用

tqdm
打印我在 Jupyter 笔记本中运行的脚本的进度。我通过
tqdm.write()
将所有消息打印到控制台。然而,这仍然给我一个像这样的倾斜输出:

也就是说,每次需要打印新行时,都会在下一行打印一个新的进度条。当我通过终端运行脚本时,不会发生这种情况。我该如何解决这个问题?

python jupyter-notebook tqdm
13个回答
369
投票

尝试使用

tqdm.notebook.tqdm
代替
tqdm
,如此处所述。

这可能就像将导入更改为一样简单:

from tqdm.notebook import tqdm

编辑:经过测试,似乎

tqdm
实际上在Jupyter笔记本中的“文本模式”下工作正常。很难说,因为您没有提供“最小示例”,但看起来您的问题是由每次迭代中的打印语句引起的。 print 语句在每次状态栏更新之间输出一个数字 (~0.89),这会弄乱输出。尝试删除打印语句。


56
投票
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,写入标准输出

一种解决方法是将两者都输出到标准输出:

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]

在这里我们可以看到,Jupyter 似乎直到行尾才清除。我们可以通过添加空格来添加另一种解决方法。如:

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

适合您,就使用它(但您可能不会读那么远)。


37
投票
tqdm

会更好。 from tqdm import tqdm_notebook as tqdm

enter image description here


33
投票

from tqdm.autonotebook import tqdm

更多信息可以在这里
找到


21
投票

from tqdm import tqdm # blah blah your code errored tqdm._instances.clear()



19
投票
pandas

使用

progress_apply
集成,您可以让
tqdm
处理它:

from tqdm.autonotebook import tqdm tqdm.pandas() df.progress_apply(row_function, axis=1)

这里的要点在于
tqdm.autonotebook

模块。正如

在 IPython Notebooks 中使用的说明 
中所述,这使得 tqdm 在 Jupyter 笔记本和 Jupyter 控制台中使用的进度条格式之间进行选择 - 由于我方面仍缺乏进一步调查的原因,
tqdm.autonotebook
选择的具体格式在
pandas
中工作顺利,而所有其他人则不然,特别是对于
progress_apply
    


7
投票
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]



5
投票
Python 3.9.2

tqdm==4.62.3
from tqdm.notebook import tqdm

for item in tqdm(list_of_items):
    do_something(item)



4
投票
tqdm

自动加载拟合进度条,无论是普通代码还是交互式环境,通过

from tqdm.auto import tqdm



0
投票
使用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])



0
投票
from tqdm import tqdm

时的额外打印。

    


0
投票

%pip install tqdm %pip install ipywidgets %jupyter nbextension enable --py widgetsnbextension %jupyter labextension install @jupyter-widgets/jupyterlab-manager import time from tqdm import tqdm for item in tqdm([0, 1, 2, 3, 4]): time.sleep(1) 100%|████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:05<00:00, 1.01s/it]

我们有进度条。


-1
投票
使用 tqdm 的进度条的另一个示例

from tqdm import tqdm my_list = list(range(100)) with tqdm(total=len(my_list)) as pbar: for x in my_list: pbar.update(1)

© www.soinside.com 2019 - 2024. All rights reserved.