python的动画和智能进度条。
alive-progress的Python项目详细描述
活动进度:)
python的一个动画和智能进度条!
有没有发现自己在一个远程ssh会话中,执行一些长时间的操作,并且时不时地感到需要点击[enter]以确保没有丢失连接?有没有想过你的程序在哪里,什么时候完成?是否需要暂停进度条一段时间,返回python repl进行手动检查或修复某个项目,然后像从未发生过一样恢复进程?我做了…< / P>
我做了一个很酷的进度条思考所有这些,活着的进度条!:
我喜欢把它看作是python的一种新的进度条,它有很多优点:
- 一个很酷的实时微调器,它可以清楚地显示进程没有挂起,并且您的终端/连接正常;
- 当微调器根据实际处理速度运行得更快或更慢时,当前速度/吞吐量的视觉反馈;
- 一种高效的多线程条,它以实际速度的一小部分(每秒1000000次迭代相当于大约60fps的刷新率)进行自我更新,以保持低CPU使用率并避免终端垃圾邮件;
- 预期到达时间(eta),它友好地显示剩余的处理时间,而不是像
eta:1584s
那样,它将很好地显示eta:0:26:24
正如您所期望的那样(但任何小于一分钟的都确实是eta:42s
); - 一个
print()
钩子,它允许在活动的条上下文中打印语句,很好地清除任何垃圾的输出,甚至在出现时使用当前计数进行充实; - 处理完成后,会打印一个漂亮的收据,其中包含运行的统计信息,包括经过的时间和观察到的吞吐量;
- 它跟踪与预期计数相关的实际计数,因此,如果您发送的数据大于或小于预期,则看起来会有所不同;
- 它会自动检测是否确实有分配的TTY,如果没有,则只打印最终收据,这样您就可以安全地将活动条包括在所有代码和其他代码中,并确保日志文件不会得到每秒60帧的垃圾;
- 你可以暂停活动吧!我认为对于进度条来说,这是一个前所未有的特性,在某些项目上编排需要手动交互的操作是不可思议的;
- 它是可定制的,有越来越多的不同的自助餐酒吧和纺纱风格,以及几个工厂很容易产生你的!
得到它
只需使用pip安装:
$ pip install alive-progress
唤醒它
打开这样的上下文管理器:
fromalive_progressimportalive_baritems=range(1000)# retrieve your set of itemswithalive_bar(len(items))asbar:# declare your expected totalforiteminitems:# iterate as usual# process each itembar()# call after consuming one item
它还活着!< < /P>
在一般行中,只需检索项目,输入活动条(总计)
上下文管理器,然后像往常一样迭代/处理,每个项目调用一次bar()
。
注释
项可以是任何iterable,通常是一些queryset;
活动条的第一个参数是期望的总数,对于querysets,它可以是a
qs.count()
,如果iterable支持它,它可以是alen(items)
,或者任何返回整数的参数;bar()
调用是使条前进的原因——通常在消费一个项目后的每次迭代中都会调用它,但您可以获得创造性!例如,只有在找到想要的东西时才可以调用它,或者在同一个迭代中多次调用它,具体取决于要监视的内容。只需相应地调整总数即可得到有用的预计到达时间;bar()
调用还返回当前计数/百分比(如果需要),并允许将情景消息传递到栏。
所以,您甚至可以像这样使用它:
withalive_bar(3)asbar:corpus=read_big_file()bar('file read, tokenizing')tokens=tokenize(corpus)bar('tokens ok, processing')process(tokens)bar()
活动条模式
实际上total
参数是可选的。如果它使条进入确定模式,则该模式用于边界良好的任务。
如果不提供,则栏将进入未知模式。在此模式下,整个进度条的动画效果与"酷"微调器类似,因为无法确定完成百分比。
注意,cool微调器仍然存在,并且每个动画彼此独立运行,在终端中呈现一个独特的显示!
然后您就有了(新的)手动模式,在这里您可以手动控制棒!
只需将manual=true
参数传递给alive_bar()
,您就可以将任何百分比(介于0和1之间的浮动)发送给bar()
处理程序,以便将活动条放在您想要的任何位置!你需要多打电话就多打。
每秒的帧数将根据发送进度和实际运行时间计算。
在这种模式下,您还可以提供总数(如果有),并获得与define模式相同的计数、吞吐量和eta统计信息。为了提高效率,只在需要时动态计算计数。
如果不提供总数,则无法推断计数和吞吐量,因此将使用更简单的%/s
,但ETA将很好地计算为100%。
输出消息
在活动进度条上下文中,有两种方式可以输出消息:
- 调用
bar(text='message')
,它设置/覆盖条线内的情景消息,通常显示有关处理所处阶段的内容,或有关正在处理的项目的一些提示; - 调用
print('message')
,它将打印一条包含活动条当前位置的丰富消息,从而留下一个日志并继续其下的条。
这两种方法在确定、未知和手动模式下工作相同,并且始终适当地清除行以清除屏幕上以前消息的任何垃圾。(单击以查看它的运动状态)
条的签名
处理程序
- 在确定和未知模式下:
条形图(文本=无)
增量SES当前计数,可选地设置情景消息,并返回新计数; - 在手动模式下:
bar(perc=none,text=none)
可选择设置新的进度百分比,可选择设置情景消息,并返回当前百分比。
样式
想知道它捆绑了什么款式?现在是演出时间!;)(单击以查看它的运动状态)
我做这些样式是为了测试工厂的所有参数组合,但我认为其中一些最终非常酷!使用它们,或者创造你自己的!
还有一个条showtime(微调器=false)
;)
定制
所有组件都可以单独定制,无论是全局的还是每次使用!
你可以混合搭配!(单击以查看它的运动状态)
高级
创建自己的动画
做你自己的纺纱机和酒吧! 有内置的支持帧,滚动,弹跳,延迟和复合微调器!发挥创造力!(单击以查看它的运动状态)
暂停机制
要使用暂停机制,必须使用生成器生成要与之交互的对象。bar对象包含另一个上下文管理器,只需使用bar.pause()执行:yield obj
举个例子,假设您需要协调事务。你需要反复检查成千上万个错误,以某种方式检测出错误,并修复它们。它们可能已损坏或未同步或无效,或其他一些不同的问题。
通常,您必须让进程运行,将发现的每个不一致添加到一个列表中,并等待很长时间,直到结束才能执行任何操作。您可以通过分块处理来减轻这种影响,但这有其自身的含义。
使用活动进度条和暂停机制,您可以在实时中检查这些事务!你只能等到找到下一个!您可以这样做:
defreconcile_transactions():qs=Transaction.objects.filter()# django example, or in sqlalchemy: session.query(Transaction).filter()withalive_bar(qs.count())asbar:fortransactioninqs:ifnotvalidate(transaction):withbar.pause():yieldtransactionbar()
然后你可以在ipython或者你喜欢的repl中使用它。只需实例化生成器并用它调用next
。进度条将像往常一样运行,但一旦发现不一致,进度条将自动暂停,您将得到提示:
In [11]: gen = reconcile_transactions() In [12]: next(gen, None) |█████████████████████ | 105/200 [52%] in 5s (18.8/s, eta: 4s) Out[12]: Transaction<#123>
以任何方式调试并修复该事务,完成后,使用与之前相同的next
继续该过程…酒吧好像什么都没发生!!多酷啊?:
In [21]: next(gen, None) |█████████████████████ | ▁▃▅ 105/200 [52%] in 5s (18.8/s, eta: 4s)
在非交互式控制台上强制播放动画(如pycharm的)
pycharm的python控制台本身并不报告为"交互式",因此我包含了一个_ tty参数,以便能够使用其中的活动进度条。
所以,就从下面开始:
withalive_bar(1000,force_tty=True)asbar:foriinrange(1000):time.sleep(.01)bar()
请注意,这个控制台的仪表化程度很高,开销也大得多,因此结果并不像您预期的那样流畅。
待办事项
为条形图创建未知模式(没有已知的总计和预计到达时间)实现暂停机制更改微调器样式更改条形图样式包括全局配置系统创建用于滚动、反弹、延迟和复合微调器的生成器创建一个微调器和条的展览,以查看它们都在运动中在配置中包括主题支持- 在微调器和条形图中包含颜色
- 尝试一些eta的自适应算法,如移动平均或指数平滑
- 欢迎任何其他想法!
有趣的事实
- 整个项目是以功能性的方式实施的;
- 它全心全意地使用闭包和生成器,它们几乎在这里的所有模块中;
- 它甚至不声明单个类;
- 它没有任何依赖关系。
更改日志突出显示:
- 1.2.0:新的填充空白条样式,填充空白的干净下溢代表
- 1.1.1:手动模式下的可选百分比
- 1.1.0:新的手动模式
- 1.0.1:pycharm控制台支持,提高与python流的兼容性
- 1.0.0:首次公开发行,已经非常完整和成熟
许可证
这个软件是根据麻省理工学院的许可证授权的。有关许可证全文,请参阅顶部分发目录中的许可证文件。
你喜欢吗?
谢谢你的关心!
我为此付出了很多努力。
希望你喜欢。