我经常看到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个进度条。尽管如此,一些文本的打印以高百分比中断进度条,其余部分随后打印出来。
是否可以&#34;冲洗&#34;进度条莫名其妙?
我看到,默认情况下tqdm
打印到stderr
并尝试刷新
sys.stderr.flush()
但这没有帮助。
以上所有内容都发生在PyCharm控制台模拟中,因此可以与此相关。
答案 0 :(得分:2)
我认为你最好的选择(因为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的情况下看到,你仍然会在正在打印的栏旁边找到字符。
答案 1 :(得分:1)
在没有看到更多代码的情况下,无法确定地说这里发生了什么。但是,下面是最可能的解释。
默认情况下,tqdm
打印到stderr
。您的对帐单Subject...
和Pickling...
将打印到stdout
。默认情况下,这两个流不同步(我什至不知道是否可以同步它们)。
如果您希望tqdm
与print
保持同步,则可以选择将tqdm
路由到stdout
而不是stderr
。这是通过以下方式实现的:
tqdm(xrange(50), file=sys.stdout)
然后,您无需刷新标准输出。
答案 2 :(得分: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模块即可。
答案 3 :(得分: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]秒。
答案 4 :(得分: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()
我希望它能起作用:)
答案 5 :(得分: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
答案 6 :(得分: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 :)