您是否想知道您的冗長處理在哪裡以及何時完成?您通常會多次按RETURN
以確保它沒有崩潰,或者 SSH 連線沒有凍結?您是否曾經想過,能夠輕鬆地暫停某些處理,返回 Python 提示符以手動修復某些項目,然後無縫地恢復它,這真是太棒了?我做了...
我已經開始這個新的進度條思考所有這些,看看活躍的進度! ?
引入 Python 進度條的最新概念! alive-progress
是獨一無二的,具有一系列很酷的功能,使其與眾不同。以下是一些亮點:
check()
工具可以幫助您設計自己的動畫!您可以看到生成的幀和動畫週期的樣子,在螢幕上爆炸,甚至在安裝到alive-progress
之前看到它是活的!這是世界上最酷的工具!釋放你的創造力! 本自述文件始終在不斷發展,因此請不時進行更全面的查看...您可能會在其他部分中找到很棒的新詳細資訊! ?
alive-progress
bar()
處理程序經過大約一年令人放心的穩定之後,新的alive-progress
終於落地了!
主要特點和改進是:
0
甚至-N
呼叫bar()
來使其向後移動!當您在迭代中無法取得任何進展或必須回滾某些內容時非常有用!還有更多!
enrich_offset
,允許您on 1:
開始或從之前計算離開的位置繼續!這裡有一個非常酷的更新!除了改進和改進終端支援之外,現在的alive-progress
還支援復原計算!
當處理巨大的資料集或需要很長時間的事情時,您可以使用批次或快取部分結果。然後,如果它停止並重新啟動,您最終會很快跳過所有那些已經完成的項目,這使得alive_bar
認為您每秒正在處理數千個項目,這反過來又完全破壞了ETA..... .但不再是了!只需告訴bar()
您已跳過項目...?
您可以透過兩種方式使用它:
1.如果您知道自己停在哪裡:
with alive_bar ( 120000 ) as bar :
bar ( 60000 , skipped = True )
for i in range ( 60000 , 120000 ):
# process item
bar ()
是的,只需呼叫bar(N, skipped=True)
一次,並輸入項目數。
2.如果不知道或物品散落:
with alive_bar ( 120000 ) as bar :
for i in range ( 120000 ):
if done ( i ):
bar ( skipped = True )
continue
# process item
bar ()
是的,就是這麼簡單!當一個專案已經完成時,只需呼叫bar(skipped=True)
即可,否則照常呼叫bar()
。您也可以在最後共用一個bar(skipped=?)
調用,並用 bool 表示您是否跳過該項目。很酷吧?
此版本還有:
max_cols
配置設置,如果無法取得它則使用的列數,例如在 jupyter 和其他不支援大小的平台中是的,我終於可以把這個版本拿出來了!這些是新的好東西:
B
、 bytes
,甚至°C
!sys.stderr
和其他檔案來代替sys.stdout
!備受期待的修復:
TypeError: unhashable type: 'types.SimpleNamespace'
。RotatingFileHandler
時支援日誌記錄!是的,尋求支持就在這裡。最後但並非最不重要的一點是,更精美的佈局讓您享受進步!
現在, alive_bar
支援雙行文字模式!
如果您想在酒吧內包含更長的情景訊息,您可能會感到被擠成一行。您必須縮小精美的動畫欄,或者更糟的是,刪除小部件(!)才能看到您需要的內容...
不再!現在您可以將條形圖設為雙線,並將文字放在其下方!
是的,整個欄下方有一條訊息,任何其他列印/記錄訊息都會在其上方滾動!
letters = [ chr ( ord ( 'A' ) + x ) for x in range ( 26 )]
with alive_bar ( 26 , dual_line = True , title = 'Alphabet' ) as bar :
for c in letters :
bar . text = f'-> Teaching the letter: { c } , please wait...'
if c in 'HKWZ' :
print ( f'fail " { c } ", retry later' )
time . sleep ( 0.3 )
bar ()
輸出:
on 7: fail "H", retry later
on 10: fail "K", retry later
Alphabet |███████████████████████████▊ | ▃▅▇ 18/26 [69%] in 6s (3.2/s, eta: 3s)
-> Teaching the letter: S, please wait...
alive_it
中還有一個新的finalize
函數參數,使您能夠設定最終收據的標題和/或文本,並改進了日誌記錄支持,可檢測自訂記錄器。
這一切都與客製化有關;現在可以更改核心小工具:
monitor
、 elapsed
和stats
小部件,讓它們看起來像你想要的那樣!令人難以置信的是,這些字串支援所有 Python 格式功能,因此您可以使用
{percent:.1%}
等。
在最終收據上可以進一步定制它們!
monitor_end
、 elapsed_end
和stats_end
,具有從標準格式繼承的動態格式!如果您之前隱藏了一些小部件,只是為了讓它們不會出現在收據上,現在您可以看到它們的所有運行榮耀,並且只隱藏收據小部件!或者相反?
另一項補充是,現在的alive-progress
每當停止時都會精美地呈現其酷炫的最終收據,即使您過早地按 CTRL+C 也是如此!我不知道為什麼我之前沒有考慮過這個問題...
Download |██████████████████︎ | (!) 45/100 [45%] in 4.8s (9.43/s)
最後,您可以選擇完全停用 CTRL+C!預設值是更安全的ctrl_c=True
,這確實使 CTRL-C 正常工作。
停用它ctrl_c=False
,使您的互動式alive_bar
使用起來更加流暢(如果您停止它,則沒有堆疊追蹤),和/或如果它位於程式的頂層!
注意:如果它位於 for 迴圈內,它將繼續進行下一個迭代,這可能是也可能不是您想要的...
for i in range ( 10 ):
with alive_bar ( 100 , ctrl_c = False , title = f'Download { i } ' ) as bar :
for i in range ( 100 ):
time . sleep ( 0.02 )
bar ()
輸出:
Download 0 |████████▊︎ | (!) 22/100 [22%] in 0.6s (36.40/s)
Download 1 |████████████████▊︎ | (!) 42/100 [42%] in 1.0s (41.43/s)
Download 2 |██████▍︎ | (!) 16/100 [16%] in 0.4s (39.29/s)
Download 3 |█████▋︎ | (!) 14/100 [14%] in 0.4s (33.68/s)
Download 4 |█████████████▎︎ | (!) 33/100 [33%] in 0.8s (39.48/s)
Download 5 |███████▎︎ | (!) 18/100 [18%] in 0.5s (37.69/s)
Download 6 |█████▎︎ | (!) 13/100 [13%] in 0.3s (37.28/s)
Download 7 |████████████︎ | (!) 30/100 [30%] in 0.8s (38.43/s)
Download 8 |██████︎ | (!) 15/100 [15%] in 0.4s (36.26/s)
...
人們經常要求的一些主要新功能終於落地了!
click.echo()
列印的新支持是的!現在, alive-progress
支援 Jupyter Notebooks,並且還包括停用狀態!兩者都備受追捧,終於落地了!
更好的是,我已經為 jupyter 筆記本實現了自動檢測機制,因此它可以開箱即用,無需對程式碼進行任何更改!
親自看看:
看起來效果很好,但目前來看,應該算是實驗性的。
在某些情況下,會出現一些視覺故障,例如兩個alive_bar
刷新連接在一起而不是彼此重疊......這是我認為我無法解決的問題:似乎Jupyter有時會在奇怪的時間刷新畫布,這使得它丟失一些數據。如果出現更有趣的事情,請告訴我這些問題。
這是alive-progress
的重大突破!
我花了一年的時間來發展它,我對我所取得的成就感到非常自豪 o/
.check()
工具可以編譯並精美地渲染來自旋轉器和條的所有動畫週期的所有幀!它們甚至可以包含完整的幀資料、內部程式碼點,甚至動畫! ?alive-progress
小工具!alive_it
,它接受一個可迭代物件並為您呼叫bar()
!由於這是主要版本更改,因此無法保證直接向後相容性。如果一開始不起作用,只需檢查新的導入和函數的簽名,就可以開始了。所有以前的功能在這裡應該仍然有效! ?
alive-progress
只需使用 pip 安裝:
❯ pip install alive-progress
如果您想知道內建的樣式是什麼,現在就是showtime
! ;)
from alive_progress . styles import showtime
showtime ()
注意:請忽略下面gif動畫中的路徑,正確的路徑在上面。生成這些長 gif 非常耗時,因此我無法對每個更改都進行另一個更改。感謝您的體諒。
我製作這些樣式只是為了嘗試我創建的所有動畫工廠,但我認為其中一些最終非常非常酷!隨意使用,隨心搭配!
您想在親自嘗試之前看到實際的alive-progress
條在您的系統中光榮地運作嗎?
❯ python -m alive_progress.tools.demo
酷吧?現在輸入ipython
REPL 並嘗試以下操作:
from alive_progress import alive_bar
import time
for x in 1000 , 1500 , 700 , 0 :
with alive_bar ( x ) as bar :
for i in range ( 1000 ):
time . sleep ( .005 )
bar ()
您會看到類似這樣的東西,整個過程都有很酷的動畫?
|████████████████████████████████████████| 1000/1000 [100%] in 5.8s (171.62/s)
|██████████████████████████▋︎ | (!) 1000/1500 [67%] in 5.8s (172.62/s)
|████████████████████████████████████████✗︎ (!) 1000/700 [143%] in 5.8s (172.06/s)
|████████████████████████████████████████| 1000 in 5.8s (172.45/s)
不錯吧?喜歡它嗎?我就知道你會的,謝謝?
要實際使用它,只需將正常循環包裝在alive_bar
上下文管理器中,如下所示:
with alive_bar ( total ) as bar : # declare your expected total
for item in items : # <<-- your original loop
print ( item ) # process each item
bar () # call `bar()` at the end
而且它還活著! ?
因此,簡而言之:一如既往地檢索項目,輸入帶有項目數量的alive_bar
上下文管理器,然後迭代/處理這些項目,最後調用bar()
!就這麼簡單! :)
items
可以是任何可迭代的,例如查詢集;alive_bar
的第一個參數是預期的總數,例如查詢集的qs.count()
、具有長度的可迭代物件的len(items)
,甚至是靜態數字;bar()
使欄前進 - 通常在每次迭代中,在完成一個專案後呼叫它;bar()
太多(或最後太少),則 bar 將以圖形方式呈現與預期total
的偏差,從而很容易注意到溢出和下溢;bar.current
。你可以發揮創意!由於只有當您呼叫
bar()
時,條會向前移動,因此它獨立於迴圈!因此,您可以使用它來監視您想要的任何內容,例如待處理的事務、損壞的項目等,甚至可以在同一迭代中多次呼叫它!因此,最後,您將了解有多少個「特殊」事件,包括它們相對於總數的百分比!
在alive_bar
上下文中,您可以毫不費力地顯示與目前顯示的進度條緊密整合的訊息!它不會以任何方式破壞,甚至會豐富您的資訊!
bar.text('message')
和bar.text = 'message'
在欄位中設定情境訊息,您可以在其中顯示目前專案或處理所處階段的資訊;bar.title('Title')
和bar.title = 'Title'
進行更改 - 與title_length
混合以防止欄更改其長度;print()
語句,其中alive_bar
很好地清理了該行,在當前條形位置旁邊打印訊息,並繼續其正下方的條形;logging
框架,包括檔案輸出,也像前一個一樣得到了豐富;click.echo()
來列印樣式文字。很棒吧?所有這些在終端機或 Jupyter 筆記本中的工作方式都是一樣的!
現在您可以更快地監控任何內容!在這裡,物品會自動為您追蹤!
看看alive_it
=> alive_bar
迭代器適配器!
只需用它包裹您的物品,然後像往常一樣在它們上循環即可!
酒吧會正常工作;就這麼簡單!
from alive_progress import alive_it
for item in alive_it ( items ): # <<-- wrapped items
print ( item ) # process each item
那有多酷? ?
所有alive_bar
參數都適用,但total
參數更聰明(如果未提供,它將使用len
或length_hint
從您的資料自動推斷),而manual
在這裡沒有意義。
請注意,那裡根本沒有任何bar
。但是,如果您確實需要它,例如設定簡訊或檢索當前進度,該怎麼辦?
您可以透過將alive_it
分配給以下變數來與內部alive_bar
進行互動:
bar = alive_it ( items ) # <<-- bar with wrapped items
for item in bar : # <<-- iterate on bar
print ( item ) # process each item
bar . text ( f'ok: { item } ' ) # WOW, it works!
請注意,這是一個稍微特殊的bar
,它不支援bar()
,因為迭代器適配器會自動為您追蹤項目。此外,它還支援finalize
,使您能夠設定最終收據的標題和/或文字:
alive_it ( items , finalize = lambda bar : bar . text ( 'Success!' ))
...
簡而言之:
- 充分利用總是
with alive_bar() as bar
,您可以在需要時迭代並呼叫bar()
;- 快速適配器用於
for item in alive_it(items)
,其中項目被自動追蹤;- 完整的適配器使用是
bar = alive_it(items)
,除了自動追蹤的項目之外,您還可以獲得一個特殊的可迭代bar
能夠根據需要自訂內部的alive_progress
。
預設模式是auto和unknown ,它們在內部使用計數器來追蹤進度。他們計算已處理的項目數,並用它來相應地更新進度條。
total
參數是可選的。如果您確實提供了它,則該欄會進入自動模式。在此模式下,會自動追蹤操作的進度,且alive-progress
必須提供的所有小部件均可用:精確條、微調器、百分比、計數器、吞吐量和 ETA。
如果您不提供total
,則欄位將進入未知模式。在這種模式下,進度是不確定的,因此預計到達時間是不確定的,因此整個進度條是連續動畫的。可用的小工具有:動畫條、微調器、計數器和吞吐量。
酷炫的旋轉器完全獨立於動畫欄運行,兩者同時運行自己的動畫,在您的終端中呈現獨特的表演! ?
最後但並非最不重要的一點是,自動模式具有獨特的功能:將項目標記為已跳過,從而使吞吐量和預計到達時間更加準確!稍後會詳細介紹。
手動模式由manual=True
參數手動激活,在內部使用百分比來追蹤進度。它使您能夠完全控制桿的位置。它通常用於監視僅提供完成百分比的進程,或產生一些隨機特效。
您可以直接與alive_bar
或透過config_handler
使用它,它允許您將百分比傳送到bar()
處理程序!例如,要將其設為 15% 完成度,只需呼叫bar(0.15)
— 即 15 / 100。
您也可以在此處提供total
。如果您這樣做, alive-progress
將自動推斷出一個內部計數器,從而能夠為您提供自動模式下可用的所有相同小部件!
如果您不提供total
,您至少會獲得吞吐量和 ETA 小部件的粗略版本,分別計算為「%/s」(每秒百分比)和直到 100%。它們都不是很準確,但總比沒有好。
當提供total
時,一切都很酷:
模式 | 櫃檯 | 百分比 | 吞吐量 | 預計到達時間 | 上溢/下溢 |
---|---|---|---|---|---|
汽車 | ✅(用戶勾選) | ✅(推論) | ✅ | ✅ | ✅ |
手動的 | ✅(推論) | ✅(使用者設定) | ✅ | ✅ | ✅ |
如果不是,則必須做出一些妥協:
模式 | 櫃檯 | 百分比 | 吞吐量 | 預計到達時間 | 上溢/下溢 |
---|---|---|---|---|---|
未知 | ✅(用戶勾選) | ✅ | |||
手動的 | ✅(使用者設定) | ✅ |
但實際上很容易理解:您不需要考慮應該使用哪種模式!
total
,如果需要,請使用manual
!就是這樣!它只會盡其所能! ? o/
bar()
處理程序bar()
處理程序支援相對或絕對語義,取決於模式:
bar()
即可將計數器增加1,或發送任何其他增量(例如bar(200)
以立即增加200;他們甚至支持
bar(0)
和bar(-5)
來保持或減少(如果需要)!
bar(0.35)
使 bar 立即跳到 35% 進度。兩種模式都可以讓您發揮創意!由於您可以讓欄立即轉到您想要的任何位置,因此您可以:
- 讓它倒退-例如以圖形方式顯示某件事的超時;
- 建立特殊效果 - 例如模仿某種即時類比儀表。
您可以根據需要多次呼叫bar()
!終端更新率將始終根據當前吞吐量和進度非同步計算,因此您不會冒向終端發送超出所需更新量的垃圾郵件的風險。
在任何情況下,要檢索當前計數器/百分比,只需呼叫: bar.current
:
最後, bar()
處理程序利用了自動模式的獨特功能:只需呼叫bar(skipped=True)
或bar(N, skipped=True)
即可使用它。當skipped
設定為= True
時,關聯的項目將從吞吐量計算中排除,從而防止跳過的項目不準確地影響ETA。
維護一個開源專案是困難且耗時的,我為此付出了很多❤️和努力。
如果您認可我的工作,可以透過捐款來支持我!謝謝 ?
showtime
展覽有一個可選參數來選擇要呈現的節目, Show.SPINNERS
(預設)、 Show.BARS
或Show.THEMES
,請看一下它們! ;)
from alive_progress . styles import showtime , Show
showtime ( Show . BARS )
showtime ( Show . THEMES )
注意:請忽略下面gif動畫中的路徑,正確的路徑在上面。生成這些長 gif 非常耗時,因此我無法對每個更改都進行另一個更改。感謝您的體諒。
主題一(?2.0 中的新內容):
showtime
展覽也接受一些客製化選項:
例如,要觀看海洋表演,您可以showtime(pattern='boat|fish|crab')
:
您也可以使用簡寫
show_bars()
、show_spinners()
和show_themes()
來存取這些節目!
還有一個名為
print_chars()
的小實用程序,可協助找到要放入自訂旋轉器和條中的酷字符,或確定您的終端是否支援 Unicode 字符。
有多種選項可以自訂外觀和行為!
所有這些都可以直接在alive_bar
中設置,也可以在config_handler
中全域設定!
這些是選項 - 括號中的預設值:
title
:可選的、始終可見的欄標題length
: [ 40
] 渲染動畫進度條的列數max_cols
: [ 80
] 如果無法取得它,則使用的最大列數,就像在 jupyter 中一樣spinner
:要在欄位旁邊渲染的微調器樣式bar
:以已知模式呈現的條狀樣式unknown
:在未知模式下渲染的條形樣式theme
: [ 'smooth'
] 一組相符的微調器、欄位與未知force_tty
: [ None
] 強制動畫開啟、關閉或根據 tty (更多詳細資訊請參閱此處)file
: [ sys.stdout
] 要使用的檔案物件: sys.stdout
、 sys.stderr
或類似的TextIOWrapper
disable
: [ False
] 如果為 True,則完全停用所有輸出,不安裝鉤子manual
: [ False
] 設定為手動控制欄位置enrich_print
: [ True
] 豐富 print() 並使用長條位置記錄訊息enrich_offset
: [ 0
] 應用於enrich_print的偏移量receipt
:[ True
]列印漂亮的最終收據,如果為False則停用receipt_text
:[ False
]設定為重複最終收據中的最後一條簡訊monitor
(bool|str): [ True
] 設定監視器小工具152/200 [76%]
{count}
、 {total}
和{percent}
的字串來自訂它elapsed
(bool|str): [ True
] in 12s
為單位配置經過時間小部件{elapsed}
字串來自訂它stats
(bool|str): [ True
] 設定統計小工具(123.4/s, eta: 12s)
{rate}
和{eta}
字串來自訂它monitor_end
(bool|str): [ True
] 在最終收據中配置監視器小部件monitor
的格式elapsed_end
(bool|str): [ True
] 配置最終收據中的經過時間小部件elapsed
的格式stats_end
(bool|str): [ True
] 在最終收據中配置統計小部件{rate}
字串來自訂它(與統計資料無關)title_length
: [ 0
] 固定標題長度,或 0 表示無限制spinner_length
: [ 0
] 強制旋轉器長度,或0
為其自然長度refresh_secs
: [ 0
] 強制刷新週期為此, 0
是反應性視覺回饋ctrl_c
: [ True
] 如果為 False,則停用 CTRL+C (捕捉它)dual_line
: [ False
] 如果為 True,則將文字放置在欄下方unit
:任何標記實體的文本scale
:應用於單位的縮放比例: None
、 SI
、 IEC
或SI2
False
或''
-> None
, True
-> SI
, 10
或'10'
-> SI
, 2
或'2'
-> IEC
precision
: [ 1
] 縮放時顯示多少位小數還有一個只能在alive_bar
上下文中本地設定:
calibrate
:校準動畫速度的最大理論吞吐量(更多詳細資訊請見此處)要在本地設定它們,只需將它們作為關鍵字參數發送給alive_bar
:
with alive_bar ( total , title = 'Processing' , length = 20 , bar = 'halloween' ) as bar :
...
要全域使用它們,請將它們傳送到config_handler
,之後建立的任何alive_bar
將包含這些選項!您可以混合和匹配它們,而本地選項始終優先於全域選項:
from alive_progress import config_handler
config_handler . set_global ( length = 20 , spinner = 'wait' )
with alive_bar ( total , bar = 'blocks' , spinner = 'twirls' ) as bar :
# the length is 20, the bar is 'blocks' and the spinner is 'twirls'.
...
是的,您可以組裝自己的旋轉器!這很容易!
我創建了大量特效,因此您可以按照自己想要的方式混合搭配它們!有幀、滾動、彈跳、順序、並排和延遲旋轉!發揮創意! ?
旋轉器的動畫是由非常先進的生成器表達式設計的,位於元工廠、工廠和生成器的幾層深處?
alive_bar
和config_handler
物件;這些生成器能夠根據旋轉器的行為執行多個不同的動畫週期,例如,彈跳旋轉器可以運行一個週期以平滑地將主體帶入場景,然後重複重新定位它直到另一側,然後使其平滑地從場景中消失= > 而這一切都只是一個週期!然後可以進行另一個循環,使一切再次發生,但倒退!彈跳旋轉器也接受左右方向不同的交替模式,這使得它們產生所有組合的笛卡爾積,可能會產生數十個不同的循環,直到它們開始重複為止! ?
還有更多,我認為我在這個動畫系統中獲得的最令人印象深刻的成就之一(除了旋轉器編譯器本身)......它們只會產生更多的動畫幀,直到當前週期沒有耗盡,然後它們自己停止!是的,下一個週期還沒開始!這種行為會在正確的位置產生自然的中斷,動畫不會受到干擾,因此我可以順利地與我想要的任何其他動畫連結!
這具有各種很酷的含義:循環可以有不同的幀數、不同的螢幕長度、它們不需要同步、它們可以自己創建長的不同序列、它們可以合作按順序或並排播放循環,而且我可以讓您驚訝地同時顯示幾個完全不同的動畫,而沒有任何干擾!
就好像他們……還活著! ?
==> 是的,這就是這個專案名稱的由來!
現在,這些週期和幀生成器已被Spinner 編譯器提前完全消耗掉!這是我在單元架構工作中製作的一個非常酷的新處理器,即使存在寬字元或複雜的字素簇,所有這些動畫也能正常工作!讓這些簇逐漸平穩地進入和退出幀,同時又不破壞 Unicode 編碼,尤其是在所有幀中保持其原始長度,這是非常困難的!是的,序列中的幾個字元可以代表另一個完全不同的符號,因此它們永遠不能被拆分!他們必須始終同時進入和退出框架,否則字素根本不會顯示(例如表情符號)!進入Spinner 編譯器......
這使得一些不可思議的事情成為可能!由於此編譯器預先產生了整個微調框資料:
因此,我可以收集所有準備播放的動畫並完成它,完全沒有運行時開銷! ?
此外,透過編譯和保存完整的幀數據,我可以創建幾個命令來重構該數據,例如更改形狀、替換字符、添加視覺暫停(幀重複)、在任何內容上按需生成彈跳效果,甚至轉置循環帶框架!
但如何才能看到這些效果呢?你創作的效果看起來不錯嗎?或者它沒有像你想像的那樣運作?是的,現在您可以以非常漂亮的方式分析所有生成的循環和幀! !
我喜歡我在這裡取得的check
?
如果我自己這麼說,那就太棒了,不是嗎?這是一個我引以為傲的非常複雜的軟體,如果你願意的話可以看看它的程式碼。
而且check
工具更強大!例如,您可以看到幀的程式碼點! !也許可以一睹為什麼這個版本的製作如此、非常困難和複雜...
在紅色中,您可以看到佔據一兩個“邏輯位置”的字素簇,無論其實際大小如何......這些是新單元架構的“單元”......
看看表情符號旗表現得多棒:
旗幟看起來移動起來如此流暢,因為它使用了“半字”!由於它是一個寬字符, alive-progress
知道它將用“兩個可見字符”渲染,並且動畫考慮到這一點,但用空格組成,空格僅佔用一個。當使用混合背景時,情況要複雜得多...
我創建的工廠類型有:
frames
:隨意繪製任意字元序列,將依序逐格播放;scrolling
:產生從一側到另一側的平滑流,隱藏在不可見邊界後面或包裹在不可見邊界上 - 允許一次使用一個主題,產生多個不同字元的循環;bouncing
:與scrolling
類似,但使動畫彈回到開始處,隱藏在不可見邊框後面或立即彈到不可見邊框上;sequential
獲得一些工廠並按順序一個接一個地玩它們!允許或不允許混合;alongside
獲得一些工廠並同時玩它們之外,為什麼要選擇當你可以擁有它們的時候呢?允許選擇動畫的樞軸;delayed
:獲取任何其他工廠並多次複製它,逐漸在每個工廠上跳過一些幀!這裡製作了非常酷的效果!有關更多詳細信息,請查看他們的文檔字串,它們非常完整。
定制欄遠非如此。假設它們是「直接的」、被動的對象。它們不支援動畫,即在給定相同參數的情況下,它們將始終生成相同的再現。請記住,旋轉器是無限的生成器,能夠產生長而複雜的序列。
好吧,bars 也有一個元工廠,使用閉包來儲存樣式參數,並接收額外的操作參數,但實際工廠無法自行產生任何內容。它仍然需要一個額外的參數,一個介於 0 和 1 之間的浮點數,即渲染自身的百分比。
alive_bar
會根據計數器和總數自動計算此百分比,但您可以在manual
模式下自行發送!
Bars 也沒有 Bar Compiler,但他們確實提供了檢查工具! ?
您甚至可以混合搭配寬字符和普通字符,就像在旋轉器中一樣! (一切都保持完美對齊?)
盡情使用檢查工具!他們還有更多好東西等著你,甚至還有即時動畫!
盡可能創建最狂野、最酷的動畫並將它們發送給我!
我正在考慮創建某種contrib
包,其中包含用戶貢獻的旋轉器和欄位!
哇,如果您已經閱讀了到目前為止的所有內容,那麼您現在應該對使用alive-progress
有了一定的了解! ?
但請做好準備,因為前方還有更多令人興奮的事情!
維護一個開源專案是困難且耗時的,我為此付出了很多❤️和努力。
如果您認可我的工作,可以透過捐款來支持我!謝謝 ?
哦,你想完全暫停,我聽說?這是一個令人驚奇的新穎概念,據我所知,在任何地方都找不到。
有了這個,您就可以在正在進行的處理過程中隨意手動對某些項目採取行動!
是的,您可以返回提示並修復、更改、提交內容,並且該欄只會「記住」它在哪裡...
假設您需要協調付款交易(曾經做過)。您需要迭代數千個,以某種方式檢測有問題的,並修復它們。此修復既不簡單也不具有確定性,您需要研究每一個以了解要做什麼。它們可能缺少收件人,或金額錯誤,或未與伺服器同步等等,甚至很難想像所有可能性。
通常,您必須讓檢測過程運行直到完成,將其發現的每個不一致附加到列表中並等待,可能需要很長時間,直到您最終可以開始修復它們......當然,您可以通過分塊處理來緩解這種情況,或列印它們並通過另一個外殼執行操作等,但這些都有其自身的缺點......?
現在,有更好的方法了!只需暫停實際檢測過程一段時間即可!然後您只需等到下一個故障被發現,並近乎即時地採取行動!
要使用暫停機制,您只需編寫一個函數,這樣程式碼就可以yield
您想要互動的項目。您很可能已經在程式碼中使用了一個,但在ipython
shell 或其他 REPL 中您可能沒有使用。因此,只需將偵錯程式碼包裝在一個函數中,然後在bar.pause()
上下文中輸入即可!
def reconcile_transactions ():
qs = Transaction . objects . filter () # django example, or in sqlalchemy: session.query(Transaction).filter()
with alive_bar ( qs . count ()) as bar :
for transaction in qs :
if faulty ( transaction ):
with bar . pause ():
yield transaction
bar ()
就是這樣!就這麼簡單! o/
現在運行gen = reconcile_transactions()
來實例化生成器,每當您想要下一個錯誤事務時,只需呼叫next(gen, None)
!我喜歡它...
alive-progress
條將照常啟動和運行,但一旦發現任何不一致,進度條將自行暫停,關閉刷新線程並記住其確切狀態,並在提示時直接將事務交給您!這幾乎是魔法! ?
In [11]: gen = reconcile_transactions()
In [12]: next(gen, None)
|█████████████████████ | 105/200 [52%] in 5s (18.8/s, eta: 4s)
Out[12]: Transaction<#123>
然後,您可以使用ipython
的常用_
快捷方式檢查交易(或直接使用t = next(gen, None)
對其進行分配),然後您就可以修復它了!
完成後,只需使用與之前相同的next
呼叫即可重新啟動該欄!酒吧再次出現,將一切重新打開,並繼續像從未停止一樣!好吧,這很神奇嗎?
In [21]: next(gen, None)
|█████████████████████ | ▁▃▅ 106/200 [52%] in 5s (18.8/s, eta: 4s)
沖洗並重複,直到出現最終收據,就不會再有錯誤的交易了。 ?
那麼,您需要監視固定操作,沒有任何循環,對吧?
一定會成功的!這是一個簡單的例子(我們稍後會做得更好):
with alive_bar ( 4 ) as bar :
corpus = read_file ( file )
bar () # file was read, tokenizing
tokens = tokenize ( corpus )
bar () # tokens generated, processing
data = process ( tokens )
bar () # process finished, sending response
resp = send ( data )
bar () # we're done! four bar calls with `total=4`
這是天真的,因為它假設所有步驟都需要相同的時間,但實際上,每個步驟可能需要非常不同的時間才能完成。認為read_file
和tokenize
可能非常快,這使得百分比飆升至 50%,然後在process
步驟中停止很長一段時間......你明白了,它會破壞用戶體驗並創建一個非常誤導性的 ETA。
為了改善這一點,您需要相應地分配步驟的百分比!由於您告訴alive_bar
有四個步驟,當第一個步驟完成時,它理解整個處理的1/4或25%已完成...因此,您需要測量您的步驟實際花費的時間並使用手動模式來在每一步將條形百分比增加適當的量!
您可以使用我的另一個開源專案 about-time 來輕鬆測量這些持續時間!只需嘗試使用一些代表性的輸入進行模擬,以獲得更好的結果。像這樣的東西:
from about_time import about_time
with about_time () as t_total : # this about_time will measure the whole time of the block.
with about_time () as t1 : # the other four will get the relative timings within the whole.
corpus = read_file ( file ) # `about_time` supports several calling conventions, including one-liners.
with about_time () as t2 : # see its documentation for more details.
tokens = tokenize ( corpus )
with about_time () as t3 :
data = process ( tokens )
with about_time () as t4 :
resp = send ( data )
print ( f'percentage1 = { t1 . duration / t_total . duration } ' )
print ( f'percentage2 = { t2 . duration / t_total . duration } ' )
print ( f'percentage3 = { t3 . duration / t_total . duration } ' )
print ( f'percentage4 = { t4 . duration / t_total . duration } ' )
就這樣吧!現在您知道所有步驟的相對時間,並且可以使用它們來改進您的原始程式碼!只需獲取累積計時並將其置於手動模式alive_bar
中即可!
例如,如果您發現的計時為 10%、30%、20% 和 40%,則您將使用 0.1、0.4、0.6 和 1.0(最後一個應始終為 1.0):
with alive_bar ( 4 , manual = True ) as bar :
corpus = read_big_file ()
bar ( 0.1 ) # 10%
tokens = tokenize ( corpus )
bar ( 0.4 ) # 30% + 10% from previous steps
data = process ( tokens )
bar ( 0.6 ) # 20% + 40% from previous steps
resp = send ( data )
bar ( 1. ) # always 1. in the last step
就是這樣!現在使用者體驗和預計到達時間應該會得到很大的改善。
是的,您可以校準旋轉器速度!
alive-progress
條對當前吞吐量有很酷的視覺回饋,因此您可以實際看到處理速度,因為旋轉器運行得更快或更慢。
為了實現這一點,我整理並實現了一些 fps 曲線,以經驗找到哪一條曲線能提供最佳的速度感:
(互動式版本[此處](https://www.desmos.com/calculator/ema05elsux))
這張圖顯示了對數(紅色)、拋物線(藍色)和線性(綠色)曲線,這些是我開始使用的曲線。這不是一項容易的任務,我進行了數十次測試,但從未找到真正激發我所尋找的速度感的測試。最好的似乎是對數,但它對小數字的反應很差。我知道我可以對這些小數字進行一些調整,因此我進行了很多實驗並調整了對數曲線(橙色虛線),直到我最終找到了我期望的行為!它似乎可以在從幾到數十億的整個範圍內提供最佳的全方位感知速度變化……這是我已經解決的曲線,它是在所有模式和條件下使用的曲線。將來,如果有人發現它有用,那麼該曲線可以是可配置的。
嗯,預設的alive-progress
校準在有界模式下為1,000,000 ,即,條形圖每秒需要 100 萬次迭代才能以每秒 60 幀的速度刷新自身。手動無界模式下為1.0 (100%)。兩者都可以實現廣泛的操作範圍並且通常工作得很好。
例如,看看這些截然不同的校準所產生的效果,以完全相同的速度運行完全相同的程式碼!注意旋轉器傳遞給使用者的感覺,該處理速度是慢還是快?請記住,這不僅刷新了旋轉器,還刷新了整條線,包括條形再現和所有小部件,因此一切都變得更加平滑或緩慢:
因此,如果您的處理速度很難達到每秒 20 個項目,並且您認為
alive-progress
變得緩慢,您可以通過將其校準為40
來增加速度感,並且它的運行速度會更快...最好總是留一些餘量並將其校準到50% 到100% 之間的值,然後從那裡調整它以找到您最喜歡的東西! :)
這些令人驚嘆的alive-progress
動畫是否拒絕顯示?
PyCharm 太棒了,我喜歡它!但我永遠不會理解為什麼他們默認禁用模擬終端...如果您確實使用 PyCharm 的輸出控制台,請在所有運行配置上啟用此功能:
我甚至建議您進入
File
>New Projects Setup
>Run Configuration Templates
,選擇Python
,並在那裡啟用它,以便您創建的任何新專案都將已經具有此設定。
除此之外,某些終端會將自己報告為“非互動式”,例如在真實終端(例如 PyCharm 和 Jupyter)中運行時、在 shell 管道中( cat file.txt | python program.py
)或在後台運行時進程(未連接到 tty)。
當alive-progress
發現自己處於非互動終端時,它會自動停用所有類型的動畫,只列印最終的收據。這樣做是為了避免弄亂管道輸出並透過數千次alive-progress
刷新向日誌檔案發送垃圾郵件。
因此,當您知道這是安全的時,您可以迫使他們看到alive-progress
的所有榮耀!這是force_tty
參數:
with alive_bar ( 1000 , force_tty = True ) as bar :
for i in range ( 1000 ):
time . sleep ( .01 )
bar ()
接受的值為:
force_tty=True
-> 始終啟用動畫,並自動偵測 Jupyter Notebook!force_tty=False
-> 始終停用動畫,僅保留最終收據force_tty=None
(預設) -> 根據終端的 tty 狀態自動偵測您也可以使用config_handler
在系統範圍內設定它,因此您不再需要手動傳遞它。
請注意,PyCharm 的控制台和 Jupyter 筆記本需要大量儀器,因此開銷要大得多,因此結果可能不會像您期望的那樣流暢。最重要的是,Jupyter 筆記本不支援 ANSI 轉義碼,因此我必須開發一些解決方法來模擬「清除線條」和「清除遊標」等功能...才能看到我想要的流暢流暢的
alive_bar
動畫,總是更喜歡功能齊全的終端。
alive-progress
沒有任何依賴性。現在它有兩個:一個是 about-time(我的另一個有趣的項目,如果我自己這麼說的話),它用於跟踪旋轉器編譯所需的時間,並生成其人類友好的再現。另一個是字素,用於檢測字素簇斷裂(我在那裡提出了一個問題,詢問它的未來和正確性,作者保證他打算在每個新的 Unicode 版本上更新該專案);alive-progress
還沒有一個 Python 類別!現在,出於非常具體的原因,它有一些微小的(更改可呼叫物件、迭代器適配器和alive_bar
小部件的一些描述符)。alive_bar
本身也只是一個函數!雖然,公平地說,它“只是”一個函數,我可以在其中動態地將多個閉包插入到其自身中(請記住,Python 函數有一個__dict__
就像類一樣?)。 alive_bar
確實注意到終端尺寸的變化,但只是相應地截斷行)。contrib
系統,以允許一種簡單的方式來分享用戶的酷炫旋轉器和酒吧。skipped
項目stderr
和其他檔案取代stdout
monitor
、 elapsed
、 stats
到這裡就完成了。
alive_it
呼叫的錯誤,檢測alive_progress的巢狀使用並拋出更清晰的錯誤訊息alive_it
中鍵入註釋skipped
項目,jupyter的新max_cols
配置設置,修復使用stderr時獲取終端的大小,正式支援Python 3.11sys.stderr
和其他檔案而不是sys.stdout
,平滑速率估計,對目前運行的小部件進行更多查詢數據,幫助系統配置錯誤monitor
、 elapsed
和stats
核心小部件,新的monitor_end
、 elapsed_end
和stats_end
核心小部件,更好地支援CTRL+C,這使得alive_bar
過早停止click.echo()
支援;更快的性能;更安全地檢測端子柱; bar.current
行為就像是屬性;刪除Python 3.6.check()
工具;棒材和紡紗機發動機改造;並排和順序旋轉器中的新動畫模式;新的內建旋轉器、欄位和主題;具有主題、滾動保護和過濾模式的動態放映時間;改進了文件日誌記錄;幾個用於自訂外觀的新配置選項;新的迭代器適配器alive_it
;使用time.perf_counter()
高解析度時鐘;需要Python 3.6+(並正式支援Python 3.9和3.10)bar.current()
方法;換行符在普通 Python REPL 上列印; Windows 上的欄位被截斷為 80 個字符bar.text()
方法,可以隨時設定情境訊息,而無需增加位置(不建議使用bar()
中的 'text' 參數);效能最佳化background
參數而不是blank
,後者接受任意大小的字串並在背景中保持固定,模擬「越過它」的條形show_spinners
和show_bars
,新實用程式print_chars
, show_bars
獲得一些高級演示(再試一次!)alive_progress
將始終嘗試跟上 Python,因此從版本 2.0 開始,我將放棄對所有進入 EoL 的 Python 版本的支援。在這裡查看他們的日程安排。
但如果您還不能遷移,請不要擔心: alive_progress
版本是常年存在的,因此只要繼續使用適合您的版本就可以了。
我強烈建議在requirements.txt 檔案中使用以下格式設定較舊的alive_progress
套件。這些將始終獲取給定版本之前的最新建置版本,因此,如果我發布錯誤修復,您也會得到它們。
❯ pip install -U " alive_progress<2 "
❯ pip install -U " alive_progress<2.2 "
❯ pip install -U " alive_progress<3.2 "
該軟體根據 MIT 許可證獲得許可。請參閱頂級分發目錄中的 LICENSE 檔案以取得完整的許可證文字。
維護一個開源專案是困難且耗時的,我為此付出了很多❤️和努力。
如果您認可我的工作,可以透過捐款來支持我!謝謝 ?