簡體   English   中英

如何顯式“刷新”tqdm 進度條?

[英]How to “flush” tqdm progress bar explicitly?

我經常看到, 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控制台模擬中發生的,所以可以與此相關。

如果沒有看到更多的代碼,就無法確定這里發生了什么。 然而,以下是最可能的解釋。

默認情況下, tqdm打印到stderr 您的語句Subject...Pickling...正在打印到stdout 默認情況下,這兩個流不同步(我什至不知道是否可以同步它們)。

如果您希望tqdmprint同步,您可以選擇將tqdm路由到stdout而不是stderr 這是通過以下方式實現的:

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

這樣您就不需要刷新標准輸出。

我認為你最好的選擇(因為 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 的情況下所看到的那樣,您仍然會在打印的欄旁邊看到字符。

要一次顯式刷新,請使用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 : 浮點數,可選 最小進度顯示更新間隔 [默認值:0.1] 秒。 maxinterval : 浮點數,可選最大進度顯示更新間隔 [默認值:10] 秒。

解決方法是強制輸出: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 模塊來做到這一點。

也許嘗試調用的函數

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]

在每次迭代之間放置 sleep() 將有助於給它時間在下一次迭代之前結束該過程。 希望它有幫助。 CMIIW :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM