如何“刷新” tqdm进度条明确?

问题描述 投票:1回答:4

我经常看到的,tqdm progress bar被其他打印,如破:

 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]

这里只有2个进度栏应该显示。尽管如此成功,一些文字印刷在高比例的中断进度条和它的其余部分是继打印出来。

是否有可能要“刷”进度条不知何故?

我阅读,tqdm打印默认情况下stderr并试图刷新它

sys.stderr.flush()

但这并没有帮助。

所有以上发生在PyCharm控制台仿真,因此它可与此有关。

python pycharm flush tqdm
4个回答
2
投票

如果没有看到您的更多的代码,这是不可能肯定这里发生了什么的话。然而,接踵而来的是最可能的解释。

默认情况下,tqdm版画stderr。您的发言Subject...Pickling...打印到stdout。默认情况下,这两个流不同步(我不知道这是否是可能的,即使将其同步)。

如果你想tqdm要与prints同步,你可以选择路线tqdmstdout而不是stderr。这是通过实现:

tqdm(xrange(50), file=sys.stdout)

那么你就不会需要刷新标准输出。


1
投票

我觉得你最好的选择(因为tqdm还挺接管输出)是使用

tqdm.write

所以如果你有一个进度条,你可以用它来尝试,并在这样的打印:

In [19]:     from tqdm import tqdm
    ...:     import time
    ...:
    ...:     for i in tqdm(xrange(50)):
    ...:         if i & 0x1 == 0:
    ...:           tqdm.write(str(i))
    ...:           time.sleep(0.5)
    ...:
0
2
4
6
8
10
12
 14%|███████████▌                                                                       | 7/50 [01:50<11:16, 15.73s/it]---------------------------------------------------------------------------             | 11/50 [00:03<00:10,  3.62it/s]

这应该结束了打印,并分别保持棒在底部。

如果您想刷新条明确你可以试试,另外使用tqdm.refresh

In [16]: gen = tqdm(xrange(50))
  0%|                                                                                           | 0/50 [00:00<?, ?it/s]
In [17]: for i in gen:
    ...:     if i & 0x1 == 0:
    ...:       print str(i)
    ...:       gen.refresh()
    ...:       time.sleep(0.5)
    ...:
    ...:
    ...:
    ...:
0
  2%|█▋                                                                                 | 1/50 [00:01<01:17,  1.59s/it]2
  6%|████▉                                                                              | 3/50 [00:02<00:55,  1.19s/it]4
 10%|████████▎                                                                          | 5/50 [00:02<00:40,  1.10it/s]6
 14%|███████████▌                                                                       | 7/50 [00:03<00:30,  1.41it/s]8
 14%|███████████▌                                                                       | 7/50 [00:03<

但你可以不使用tqdm.write看你还是落得个字符旁边正在打印的条形码。


0
投票

该解决方案是迫使输出:tqdm.write正在等待的字符串,并且允许指定结束。

for sentences_db, itdqm in zip(sentences_dbs, tqdm(range(len(sentences_dbs)))):
    tqdm.write(itdqm.__str__(), end='')

您可以强制有文件属性的输出(即:文件= sys.stderr),因为当它是非常快,输出具有方向性问题(标准输出,而不是标准错误)。导入sys模块,以做到这一点。


0
投票

要一次明确地冲洗,使用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()    

更复杂的,嵌套循环例如:

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()

需要注意的是tqdm has parameters刷新频率有关:

mininterval:浮子,可选最小进展显示更新周期[默认:0.1]秒。 maxinterval:浮子,可选最大进展显示更新周期[默认值:10]秒。

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