python的动画和智能进度条。

alive-progress的Python项目详细描述


活着!

活动进度:)

python的一个动画和智能进度条!

pypi versionpypi pyversionspypi status

有没有发现自己在一个远程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,它可以是aqs.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);)

活动进度条样式

定制

所有组件都可以单独定制,无论是全局的还是每次使用!

你可以混合搭配!(单击以查看它的运动状态

动态进度定制

高级

创建自己的动画

做你自己的纺纱机和酒吧! 有内置的支持帧,滚动,弹跳,延迟和复合微调器!发挥创造力!(单击以查看它的运动状态

alive progress creative

暂停机制

要使用暂停机制,必须使用生成器生成要与之交互的对象。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:首次公开发行,已经非常完整和成熟

许可证

这个软件是根据麻省理工学院的许可证授权的。有关许可证全文,请参阅顶部分发目录中的许可证文件。

你喜欢吗?

谢谢你的关心!

我为此付出了很多努力。

希望你喜欢。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaREST/SOAP服务技术栈   爪哇的意图。getExtras()。getString“”应用程序在重新打开时崩溃   java如何实现doGeneratemethod?   有CMU Sphinx本地lmtool for java吗?   json如何将字符串传递给。来自java IntelliJS文件中的   java在play1中使用ssl。2.4申请   java在NetBeans中生成匿名侦听器   抛出java错误消息:索引超出界限异常   对于java中当前声明的变量,有没有办法将两个不同对象的输入分开?   JavaEJB与Spring+POJO   java如何使spring boot嵌入式tomcat返回200 OK作为基本url?   java在运行时根据登录用户更改数据库模式   数组如何让Java忽略ArrayList中的负值?   javascript将在JSP文件中编译脚本?   java JPA@OneToMany和@EmbeddedId   rxtx使用java通过串行电缆从PCB板读取数据   java LIBGDX创建音乐时出错