Jupyter笔记本中的tqdm

Roh*_*ena 100 python jupyter-notebook tqdm

我正在使用tqdm我在Jupyter笔记本中运行的脚本中打印进度.我通过打印所有消息到控制台tqdm.write().但是,这仍然给我一个偏差的输出,如下所示:

在此输入图像描述

也就是说,每次必须打印新行时,下一行都会打印一个新的进度条.当我通过终端运行脚本时,这不会发生.我怎么解决这个问题?

小智 161

尝试使用tqdm.notebook.tqdm,而不是tqdm作为概述这里.它在这个阶段是实验性的,但在大多数情况下效果很好.

这可以像将导入更改为:

from tqdm.notebook as tqdm

祝好运!

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

  • 我没有使用`print()`语句,而是使用了'tqdm.write()`。但是,`tqdm_notebook`给出了很好的结果。谢谢 : ) (2认同)
  • @bugmenot123 很好,已修复。 (2认同)
  • 这似乎是最简单的方法:“from tqdm.autonotebook import tqdm” (2认同)

小智 31

大多数答案现在已经过时了。如果正确导入tqdm 会更好。

from tqdm import tqdm_notebook as tqdm
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 又变了:`TqdmDeprecationWarning:该函数将在 tqdm==5.0.0 中删除,请使用 tqdm.notebook.tqdm 而不是 tqdm.tqdm_notebook` (14认同)

de1*_*de1 28

对于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)
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样(进度会显示为红色):

  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
Run Code Online (Sandbox Code Playgroud)

问题是stdoutstderr的输出是按照新行异步和单独处理的.

如果说Jupyter在stderr上收到第一行,然后是stdout上的"已处理"输出.然后,一旦它在stderr上收到输出以更新进度,它就不会返回并更新第一行,因为它只会更新最后一行.相反,它必须写一个新的行.

解决方法1,写入stdout

一种解决方法是将两者输出到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)
Run Code Online (Sandbox Code Playgroud)

输出将更改为(不再为红色):

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]
Run Code Online (Sandbox Code Playgroud)

在这里我们可以看到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)
Run Code Online (Sandbox Code Playgroud)

这给了我们:

processed: 1                                                  
processed: 2                                                  
processed: 3                                                  
100%|??????????| 3/3 [00:02<00:00,  1.53it/s]
Run Code Online (Sandbox Code Playgroud)

解决方法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)
Run Code Online (Sandbox Code Playgroud)

使用输出(描述在处理时更新):

processed: 3: 100%|??????????| 3/3 [00:02<00:00,  1.53it/s]
Run Code Online (Sandbox Code Playgroud)

结论

你可以通过普通的tqdm使它工作得很好.但是如果tqdm_notebook适合你,那就用它(但那时你可能不会那么读).


mja*_*sie 14

要完成 oscarbranson 的回答:可以根据运行的位置自动选择控制台或笔记本版本的进度条:

from tqdm.autonotebook import tqdm
Run Code Online (Sandbox Code Playgroud)

更多信息可以在这里找到


Jam*_*ers 14

以上都不适合我。我发现在错误后运行以下对这个问题进行排序(它只是清除后台进度条的所有实例):

from tqdm import tqdm

# blah blah your code errored

tqdm._instances.clear()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!但是,如果不存在实例,它会抛出错误。仍然想将它与脚本和 Hydrogen IDE 一起使用。这是我的代码。`try: # 避免笔记本电脑/Hydrogen IDE 上的问题 tqdm.tqdm._instances.clear() except Exception: pass` (2认同)

Jul*_*lva 7

如果此处的其他技巧不起作用,并且-和我一样-您正在通过中使用pandas集成progress_apply,则可以进行tqdm处理:

from tqdm.auto import tqdm
tqdm.pandas()

df.progress_apply(row_function, axis=1)
Run Code Online (Sandbox Code Playgroud)

这里的重点在于tqdm.auto模块。如他们在IPython Notebook中使用的说明中所述,这使tqdmJupyter笔记本和Jupyter控制台使用的进度条格式之间可以进行选择-由于我这一方面仍然缺乏进一步的研究,因此选择的特定格式tqdm.auto可以在中顺利进行pandas,而所有其他格式都没有不是,progress_apply特别是。


Neb*_*ulo 5

对于使用 Windows 并且无法使用此处提到的任何解决方案解决重复条问题的每个人。我必须colorama按照tqdm修复它的已知问题中的说明安装该软件包。

pip install colorama
Run Code Online (Sandbox Code Playgroud)

用这个例子试试:

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)
Run Code Online (Sandbox Code Playgroud)

这将产生类似的东西:

All:  60%|????????????????????????                | 3/5 [00:03<00:02,  1.02s/it]
Sub:  50%|???????????????????                  | 50/100 [00:00<00:00, 97.88it/s]
Run Code Online (Sandbox Code Playgroud)


saf*_*fay 5

使用Python 3.9.2tqdm==4.62.3

from tqdm.notebook import tqdm

for item in tqdm(list_of_items):
    do_something(item)
Run Code Online (Sandbox Code Playgroud)