14

我经常看到,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]

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

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

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

sys.stderr.flush()

但这没有帮助。

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

4

7 回答 7

14

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

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

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

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

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

于 2019-02-03T08:48:08.030 回答
4

我认为你最好的选择(因为 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 的情况下所看到的那样,您最终仍然会在打印的栏旁边出现字符。

于 2017-09-06T09:38:57.487 回答
1

要一次显式刷新,请使用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 具有与刷新频率相关的参数:

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

于 2018-09-24T13:17:20.240 回答
0

试着帮助我做什么。

import sys
from tqdm import tqdm
from time import sleep
print('This is done')
sleep(.5)
for i in tqdm(range(0,30), total = (30), desc = 'Subject S9'):
    sleep(.3)
    sys.stdout.flush()
sleep(.5)

for i in tqdm(range(0,30), total = (30), desc = 'Pickling...'):
    sleep(.3)
    sys.stdout.flush()

sleep(.5)

输出将是:

This is done
Subject S9: 100%|██████████| 30/30 [00:09<00:00,  3.30it/s]
Pickling...: 100%|██████████| 30/30 [00:09<00:00,  3.30it/s]

只需在每次迭代之间放置 sleep() 将有助于给它时间在下一次迭代之前结束进程。希望能帮助到你。CMIIW :)

于 2021-03-25T03:10:11.660 回答
0

解决方案是强制输出:tqdm.write 正在等待一个字符串,并允许指定结束。

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

您可以使用文件属性(即:file=sys.stderr)强制输出,因为当它非常快时,输出会出现方向问题(stdout 而不是 stderr)。导入 sys 模块来做到这一点。

于 2018-08-08T09:41:04.770 回答
0

也许尝试调用的函数

tqdm.clear

但是...在此之前制作一个对象或...

我会告诉你代码:-

from tqdm import tqdm
bar = tqdm(yourList)
for i in bar:
    #Do Stuff :)
    #But Right Where You Wanna Make It Go And Come Back Do This :-
    bar.clear()

我希望它有效:)

于 2020-06-27T12:45:38.157 回答
0

这对我有用:

print(f'First print')
for x in tqdm(some_list):
    some_operation = 1+1

# Surround next print with some sleepy time to have give the previous tqdm bar time to finish
time.sleep(0.5)
print(f'Second print')
time.sleep(0.5)

for y in tqdm(some_other_list):
    some_other_operation = 1+3+3+7
于 2021-03-05T10:13:00.387 回答