如何显式“刷新”tqdm 进度条?

Dim*_*ims 12 python flush pycharm tqdm

我经常看到,tqdm进度条被其他打印件打破,例如:

 93%|??????????| 28/30 [00:02<00:00, 13.44it/s]Subject S9
100%|??????????| 30/30 [00:02<00:00, 12.94it/s]
 93%|??????????| 28/30 [00:02<00:00, 11.49it/s]Pickling...
100%|??????????| 30/30 [00:02<00:00, 11.47it/s]
Run Code Online (Sandbox Code Playgroud)

这里应该只显示 2 个进度条。尽管如此成功,打印一些文本会以很高的百分比中断进度条,其余的会在之后打印出来。

是否可以以某种方式“刷新”进度条?

我读过,默认情况下会tqdm打印stderr并尝试刷新它

sys.stderr.flush()
Run Code Online (Sandbox Code Playgroud)

但这没有帮助。

以上都是在PyCharm控制台模拟中发生的,所以可以与此相关。

Zay*_*ydH 13

如果没有看到更多的代码,就无法确定这里发生了什么。然而,以下是最可能的解释。

默认情况下,tqdm打印到stderr. 您的报表Subject...Pickling...正在打印到stdout. 默认情况下,这两个流不同步(我什至不知道是否可以同步它们)。

如果您想tqdmprints同步,您可以选择路由tqdmstdout而不是stderr. 这是通过以下方式实现的:

tqdm(xrange(50), file=sys.stdout)
Run Code Online (Sandbox Code Playgroud)

这样您就不需要刷新标准输出。


ntg*_*ntg 6

要一次显式刷新,请使用refresh(). 要在最后显式刷新,如果 tqdm 卡住,您应该调用tqdm.close(self). 例子:

import time
i_range=tqdm(range(5))
for i in i_range:
        i_range.refresh()
        time.sleep(1)
i_range.close()    
Run Code Online (Sandbox Code Playgroud)

更复杂的嵌套循环示例:

progress = tqdm(range(5*3 ) )
for i in range(5):
    print '============================='
    for j in range(3):
        time.sleep(1)
        progress.update()
        progress.refresh()
progress.close()
Run Code Online (Sandbox Code Playgroud)

请注意, tqdm 有与刷新频率相关的参数:

mininterval : float, 可选 最小进度显示更新间隔 [默认值: 0.1] 秒。maxinterval : float, 可选最大进度显示更新间隔 [默认值: 10] 秒。


Dan*_*i K 5

我认为你最好的选择(因为 tqdm 有点接管输出)是使用

\n\n

tqdm.write

\n\n

因此,如果您有进度条,您可以使用它来尝试打印,如下所示:

\n\n
In [19]:     from tqdm import tqdm\n    ...:     import time\n    ...:\n    ...:     for i in tqdm(xrange(50)):\n    ...:         if i & 0x1 == 0:\n    ...:           tqdm.write(str(i))\n    ...:           time.sleep(0.5)\n    ...:\n0\n2\n4\n6\n8\n10\n12\n 14%|\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                                                                       | 7/50 [01:50<11:16, 15.73s/it]---------------------------------------------------------------------------             | 11/50 [00:03<00:10,  3.62it/s]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这应该最终打印并将栏单独保留在底部。

\n\n

如果您想明确刷新该栏,您可以尝试tqdm.refresh另外使用:

\n\n
In [16]: gen = tqdm(xrange(50))\n  0%|                                                                                           | 0/50 [00:00<?, ?it/s]\nIn [17]: for i in gen:\n    ...:     if i & 0x1 == 0:\n    ...:       print str(i)\n    ...:       gen.refresh()\n    ...:       time.sleep(0.5)\n    ...:\n    ...:\n    ...:\n    ...:\n0\n  2%|\xe2\x96\x88\xe2\x96\x8b                                                                                 | 1/50 [00:01<01:17,  1.59s/it]2\n  6%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x89                                                                              | 3/50 [00:02<00:55,  1.19s/it]4\n 10%|\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\x8e                                                                          | 5/50 [00:02<00:40,  1.10it/s]6\n 14%|\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                                                                       | 7/50 [00:03<00:30,  1.41it/s]8\n 14%|\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                                                                       | 7/50 [00:03<\n
Run Code Online (Sandbox Code Playgroud)\n\n

但正如您所看到的,如果不使用 tqdm.write,您仍然会在打印的栏旁边看到字符。

\n