本文适合有 Python 基础的朋友
打开网易新闻 查看更多图片

本文作者:HelloGitHub-Anthony

HelloGitHub 推出的《讲解开源项目》系列,本期介绍让你快速拥有完美进度条的 Python 三方库——alive-progress

不知你是否有过这样的经历:你写了一个程序,每次运行都会耗费很长时间。在等待程序运行期间你一次次地按下回车防止程序卡死。亦或者你的任务需要实时掌握程序运行进度但你根本不知道程序执行到了哪里...

现在,alive-progress 来了,它是一个 Python 下的进度条库,不仅使用方便而且支持多种炫酷显示效果!让我们先来看看示例效果:

下面让我们一起玩转这个库!

一、安装

在 Python 下使用 pip 进行安装:

pip install alive-progress

二、快速入门

2.1 直接使用

在循环中使用 alive-progress 是最常见的用法,脚本可以这样写:

打开网易新闻 查看更多图片

请注意,如果无法正常显示动画则尝试在 alive_bar 中加上 force_tty=True 参数。

运行以上代码我们可以看到在终端中出现了一个还算华丽的动态进度条:

需要注意的是 alive-progress 并不像 tqdm 等进度条库一样会自动更新,只有我们程序调用了 bar 才会让进度条 +1

当然,我们也可以不给进度条传入总数目这个参数,此时进度条将不显示进度,并进入未定义模式:

有时候我们想直接操纵显示的位置,这时候可以设定alive_bar 的manual 参数为True:

当然,在运行过程中我们也需要输出一些提示信息,直接使用print 可以在不破坏进度条的情况下输出一行提示信息,text 方法则可以在进度条尾部添加后缀字符,而title 参数则可以给进度条添加标题(前缀信息),具体使用方法及效果如下:

打开网易新闻 查看更多图片

2.2 添点花样

看多了传统的进度条样式想换换花样?没问题,alive-progress 不仅内置了多种进度条样式,还支持自定义格式。

进度条可以自定义的样式分为两种:bar 和spinner,只需要在调用alive_bar 的时候传入对应的参数即可。

以这个进度条为例,中间最长的是bar,旁边来回晃动的HelloGitHub 是spinner。

alive-progress 内置了多种 bar 和 spinner 样式,只需要调用show_bars 或者show_spinners 即可快速预览相应的样式,例如:

from alive_progress import
show_barsshow_bars() # 查看内置 bar 样式

from alive_progress import show_spinners
show_spinners() # 查看内置 spinner 样式

默认样式使用起来非常简单,例如我想使用bubbles 这个 bar 和message_scrolling 这个 spinner,直接传入对应名称即可:

打开网易新闻 查看更多图片

如果不知道total 的数目,可以使用unknown 参数(这时候将替换 bar 为 spinner):


三、私人定制

或许比起直接使用内置模板你更喜欢自己定制的进度条,对此 alive-progress 也提供了对应方法。

3.1 定制 bar

使用standard_bar_factory 方法可以快速定制 bar,bar 可以设置的参数有五个:

  1. chars:正在执行单元的动画,按照进度依次显示。
  2. borders:进度条边界,显示在左右两边。
  3. background:未执行到单元显示的内容。
  4. tip:执行单元的前导符号。
  5. errors:出错时(进度未走全,超出 total 值等)时显示的字符。

例如我们想做一个如图所示的 bar:

则可以这样来写:

3.2 定制 spinner

对于 spinner,alive-progress 提供了更多种的动画定义方式:

frame_spinner_factory:将传入的字符串挨个输出:

可以看到字符串挨个循环输出。

scrolling_spinner_factory:将字符串滚动播出

bouncing_spinner_factory:将两个字符串交替滚动播出


当然,也可以省略 left_chars 这个参数,其效果相当于 I love 将会像弹球一样左右弹动。

unknown_bar_factory:将 spinner 转换为能使用在未定义模式中的格式:


四、结尾

到这里,相信你已经掌握了 alive_progress 的基本玩法,alive-progress 还提供了一些在不同场合所需的特殊功能,有兴趣的朋友可以通过阅读官方文档或源代码进行更加深入的了解。