您是否想知道您的冗长处理在哪里以及何时完成?您是否通常会多次按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
:获取其他任何工厂并多次复制它,越来越多地跳过每个帧!在这里产生了非常酷的效果!有关更多详细信息,请查看他们的docstrings,这是非常完整的。
定制条远不及涉及的条。假设它们是“直接”的被动物体。它们不支持动画,即给定相同的参数,它们总是会生成相同的演绎。请记住,旋转器是无限发电机,能够产生长而复杂的序列。
好吧,酒吧还设有一个元工厂,使用封闭来存储样式参数并接收其他操作参数,但是实际工厂无法本身生成任何内容。它仍然需要一个额外的参数,一个在0到1之间的浮点数,这是渲染自身的百分比。
alive_bar
根据计数器和总计会自动计算此百分比,但是您可以在manual
模式下自行发送!
酒吧也没有栏编译器,但它们确实提供了检查工具! ?
您甚至可以像旋转器一样混合和匹配宽阔的字符和普通字符! (一切都保持完美状态吗?)
使用检查工具来满足您内心的内容!!他们还有更多的好东西在等您,甚至是实时动画!
创建您可以创建最疯狂,最酷的动画,然后将它们发送给我!
我正在考虑使用用户限制的旋转器和酒吧创建某种contrib
软件包!
哇,如果您阅读了所有内容,直到这里,您现在应该有关于使用alive-progress
合理知识! ?
但是要做好准备,因为还有更多令人兴奋的东西在未来!
维护开源项目很艰难且耗时,我为此付出了很多❤️和精力。
如果您感谢我的工作,则可以捐款支持我!谢谢 ?
哦,你想完全停下来,我听到吗?这是一个了不起的小说概念,在任何地方都找不到。
这样,您就可以随意在正在进行的处理中手动对某些项目行动!!
是的,您可以返回提示,修复,更改,提交内容,并且酒吧只会“记住”它在哪里...
假设您需要调和付款交易(在那里,这样做)。您需要迭代数千个,以某种方式检测到有故障的情况,然后修复它们。此修复程序并不简单,也不确定性,您需要研究每个修复程序以了解该怎么做。他们可能缺少收件人,或者没有错误的数量,或者与服务器等同步,甚至很难想象所有可能性。
通常,您必须让检测过程运行直到完成,并将其找到的每个不一致的列表附加到列表中,并等待很长一段时间,直到您最终才能开始修复它们...您当然可以通过在块中进行处理来减轻这种情况,或者打印它们并通过另一个外壳等表演,但是这些有自己的缺点...?
现在,有更好的方法!只需暂停一段时间的实际检测过程!然后,您只需要等到找到下一个故障,然后几乎实时采取行动!
要使用暂停机制,您只需要编写一个函数,因此代码可以yield
您要与之交互的项目。您很可能已经在代码中使用了一个,但是在ipython
shell或另一个替补中,您可能没有。因此,只需将您的调试代码包装在功能中,然后输入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%...因此,您需要测量实际的步骤实际操作多长时间,并使用手动模式到在每个步骤中,将条形百分比提高到适量!
您可以使用我的另一个关于时间的开源项目来轻松测量这些持续时间!只需尝试与某些代表性输入进行模拟,以获得更好的结果。像这样的东西:
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
就是这样!现在应该大大改善用户体验和ETA。
是的,您可以校准旋转器速度!
alive-progress
杆具有当前吞吐量的凉爽视觉反馈,因此您实际上可以查看处理的速度,因为旋转器运行得更快或速度较慢。
为此,我组合在一起并实施了一些FPS曲线,以凭经验发现哪种曲线给人最好的速度感觉:
(Interactive版本[此处](https://www.desmos.com/calculator/ema05elsux))
该图显示了对数(红色),抛物线(蓝色)和线性(绿色)曲线,这些都是我开始的。这不是一件容易的事,我已经进行了数十次测试,而且从未找到真正启发我一直在寻找的速度感觉的测试。最好的人似乎是对数,但对少量的反应。我知道我可以对这些少量数字进行几次曲折,因此我进行了很多试验并调整了对数曲线(点缀橙色),直到我终于找到了我期望的行为!它似乎可以在整个频谱中提供最佳的全方位感知速度变化,从几十到数十亿美元……那是我与之解决的曲线,并且是所有模式和条件中使用的曲线。将来,如果有人发现它有用,则该曲线可以配置。
好吧,默认的alive-progress
校准为有限模式为1,000,000 ,即,酒吧每秒以每秒60帧的速度刷新每秒需要100万个迭代。在手动无界模式下,为1.0 (100%)。两者都可以实现巨大的操作范围,并且通常运行良好。
例如,看看这些非常不同的校准的效果,以相同的速度运行相同的代码!请注意,旋转器传递给用户的感觉,该处理的过程缓慢还是快速?请记住,这不仅是旋转器令人耳目一新,而且整个生产线,都配有条形图和所有小部件,所以一切都变得更加顺畅或呆滞:
因此,如果您的处理几乎每秒几乎无法达到20个项目,并且您认为
alive-progress
正在使Slugghish变得迟钝,那么您可以通过对其进行校准来提高速度感,例如40
最好总是留出一些净空,然后将其校准至50%至100%之间,然后从那里进行调整以找到最喜欢的东西! :)
这些令人惊讶的alive-progress
动画是否拒绝展示?
Pycharm很棒,我喜欢它!但是我永远不会理解为什么他们默认情况下会禁用终端...如果您确实使用Pycharm的输出控制台,请在所有运行配置上启用此功能:
我什至建议您进入
File
>New Projects Setup
>Run Configuration Templates
,选择Python
,然后在此处启用它,因此您创建的任何新的都将拥有此集合。
除此之外,一些终端将自己报告为“非相互作用”,例如在shell Pipelines( cat file.txt | python program.py
)中,在真实的终端(例如Pycharm和Jupyter)中使用时,或者在后台过程(未连接到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笔记本!force_tty=False
-->始终禁用动画,仅保留最终收据force_tty=None
(默认) - >根据终端的TTY状态,自动检测您还可以使用config_handler
设置系统范围内,因此您无需手动通过它。
请注意,Pycharm的控制台和Jupyter笔记本电脑都有大量的仪器,因此开销更多,因此结果可能不会像您预期的那样流畅。最重要的是,jupyter笔记本不支持ANSI逃生代码,因此我必须开发一些解决方法来模仿“清除线”和“从光标透明”等功能...以查看我的意图,以查看流体和光滑的
alive_bar
动画,始终更喜欢一个成熟的终端。
alive-progress
没有任何依赖。现在有两个:一个是关于时间的(我自己这么说的话,如果我这么说的话),它用于跟踪旋转器编译所花费的时间,并产生对人类友好的演绎。另一个是素数,是为了检测格素集群中断(我已经在那里打开了一个问题,询问其未来和正确性,作者保证他打算在每个新的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
项目的新恢复计算支持,新的max_cols
配置设置为jupyter,修复使用stderr时端子的大小,正式支持python 3.11sys.stderr
和其他文件而不是sys.stdout
,使速率估算平滑,更多查询到当前正在运行的adbots''数据,配置错误中的帮助系统monitor
, elapsed
和stats
核心小部件,新的monitor_end
, elapsed_end
和stats_end
核心小部件,更好alive_bar
支持Ctrl+Cclick.echo()
支持;更快的性能;更安全的终端柱检测; bar.current
行为就像财产一样;删除Python 3.6.check()
旋转器和棒中的工具;酒吧和旋转器发动机改造;新的动画模式与连续的旋转器一起使用;新的内置旋转器,酒吧和主题;主题,滚动保护和滤波器图案的动态表演时间;改进文件的日志记录;定制外观的几种新配置选项;新的迭代适配器alive_it
;使用time.perf_counter()
高分辨率时钟;需要Python 3.6+(并正式支持Python 3.9和3.10)bar.current()
方法; Newlines被印在Vanilla Python Repp上;酒吧在窗户上被截断为80个字符bar.text()
方法,可以随时设置情境消息,而无需递增位置( bar()
中的“ extrece text”参数);性能优化background
参数,而不是blank
,该参数接受任意尺寸的字符串并保持在后台,模拟栏“越过它”show_spinners
和show_bars
,show_bars,new Utility print_chars
,show_bars, show_bars
获得一些高级演示(重试它!)!alive_progress
将始终尝试跟上Python,因此从2.0版开始,我将放弃对所有输入EOL的Python版本的支持。在这里查看他们的时间表。
但是,不用担心您是否还不能迁移: alive_progress
版本是多年生的,因此请继续使用适合您的产品,并且效果很好。
我强烈建议您在sumplion.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 文件以获取完整的许可证文本。
维护开源项目很艰难且耗时,我为此付出了很多❤️和精力。
如果您感谢我的工作,可以捐款支持我!谢谢 ?