Python 如何";齐平;TQM进度条?

Python 如何";齐平;TQM进度条?,python,pycharm,flush,tqdm,Python,Pycharm,Flush,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] 但这没有帮

我经常看到,这是打破了其他打印,如:

 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]
但这没有帮助

所有这些都是在PyCharm控制台模拟中发生的,因此它可能与此相关。

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

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.write,您仍然会在正在打印的条旁边显示字符。

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

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

您可以使用file属性(即:file=sys.stderr)强制输出,因为当速度非常快时,输出会出现方向问题(stdout而不是stderr)。导入sys模块以执行此操作。

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

更复杂的嵌套循环示例:

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()
请注意,与刷新频率相关:

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


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

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

如果希望
tqdm
print
s同步,可以选择将
tqdm
路由到
stdout
而不是
stderr
。这是通过以下方式实现的:

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

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

可以尝试调用

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()
我希望它能起作用:)

这对我来说很有效:

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

试着帮我做对我有用的事

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]
这就完成了

主题S9:100%|██████████| 30/30[00:09 PyCharm;)外部测试。根据我的经验,PyCharm提供的控制台有时会出现一些问题。请解释一下您的第二个示例,好吗?您创建了一个
tqdm
对象,但您不迭代它。这里发生了什么?我使用的不是迭代它,而是.update()这与在循环中显式调用iterable的.next()方法而不是迭代iterable类似…每次我调用
progress.update()
,它都会将tqdm对象向前推进一步…tqdm对象的范围是第一个循环大小乘以第二个循环大小…我添加了
refresh()
命令,以便更新后的值显示在屏幕上。
clear
方法在循环中未调用
print
时效果良好。如果是,仍会出现类似OP reported的奇怪行为。
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
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]