跳转到主要内容

启迪进度条

项目描述

Documentation Status GitHub Actions Status Coverage Status
Linux supported Windows supported MacOS supported BSD supported
PyPI Package latest release Supported versions Supported implementations
Latest Fedora Version Latest EPEL Version Latest Debian Version Latest Ubuntu Version Latest Conda Forge Version

概述

启迪进度条是Python的控制台进度条库。

启迪的主要优势是它允许在不进行任何重定向或额外代码的情况下写入stdout和stderr。就像你通常打印或记录一样。

启迪还包括对Jupyter Notebooks的实验性支持。


https://raw.githubusercontent.com/Rockhopper-Technologies/enlighten/master/doc/_static/demo.gif

此动画的代码可以在demo.py中找到,在示例文件夹中。

文档

https://python-enlighten.readthedocs.io

安装

PIP

$ pip install enlighten

RPM

Fedora和EL8 (RHEL/CentOS)

(对于EPEL存储库必须配置)

$ dnf install python3-enlighten

DEB

Debian和Ubuntu

$ apt-get install python3-enlighten

Conda

$ conda install -c conda-forge enlighten

使用方法

管理器

第一步是创建一个管理器。管理器处理输出到终端,并允许同时显示多个进度条。

get_manager 可以用来获取一个 Manager 实例。默认情况下,只有当输出流 sys.__stdout__ 连接到 TTY 时,管理器才会显示输出。如果流未连接到 TTY,返回的管理器实例将处于禁用状态。

在大多数情况下,可以像这样创建管理器。

import enlighten
manager = enlighten.get_manager()

如果您需要使用不同的输出流或覆盖默认设置,请参阅 get_manager 的文档。

进度条

对于基本的进度条,可以调用 Manager.counter 方法。

import time
import enlighten

manager = enlighten.get_manager()
pbar = manager.counter(total=100, desc='Basic', unit='ticks')

for num in range(100):
    time.sleep(0.1)  # Simulate work
    pbar.update()

可以通过多次调用 Manager.counter 方法来创建额外的进度条。

import time
import enlighten

manager = enlighten.get_manager()
ticks = manager.counter(total=100, desc='Ticks', unit='ticks')
tocks = manager.counter(total=20, desc='Tocks', unit='tocks')

for num in range(100):
    time.sleep(0.1)  # Simulate work
    print(num)
    ticks.update()
    if not num % 5:
        tocks.update()

manager.stop()

计数器

Counter 类有两种输出格式:进度条和计数器。

当总数不是 None 且计数少于总数时,使用进度条格式。如果这两个条件都不满足,则使用计数器格式。

import time
import enlighten

manager = enlighten.get_manager()
counter = manager.counter(desc='Basic', unit='ticks')

for num in range(100):
    time.sleep(0.1)  # Simulate work
    counter.update()

状态条

状态条是类似于进度条和计数条的条形,但展示的是相对静态的信息。使用 Manager.status_bar 创建状态条。

import enlighten
import time

manager = enlighten.get_manager()
status_bar = manager.status_bar('Static Message',
                                color='white_on_red',
                                justify=enlighten.Justify.CENTER)
time.sleep(1)
status_bar.update('Updated static message')
time.sleep(1)

状态条也可以使用带有动态变量的格式化。

import enlighten
import time

manager = enlighten.get_manager()
status_format = '{program}{fill}Stage: {stage}{fill} Status {status}'
status_bar = manager.status_bar(status_format=status_format,
                                color='bold_slategray',
                                program='Demo',
                                stage='Loading',
                                status='OKAY')
time.sleep(1)
status_bar.update(stage='Initializing', status='OKAY')
time.sleep(1)
status_bar.update(status='FAIL')

状态条,像其他条形一样,可以被固定。要固定状态条在所有其他条形的顶部,请在其他条形之前初始化它。要固定条形在屏幕底部,初始化时使用 position=1

有关详细信息,请参阅 StatusBar

颜色

可以通过设置 color 关键字参数来为状态条和进度条的条形组件着色。有关有效颜色的更多信息,请参阅 Series Color

import time
import enlighten

manager = enlighten.get_manager()
counter = manager.counter(total=100, desc='Colorized', unit='ticks', color='red')

for num in range(100):
    time.sleep(0.1)  # Simulate work
counter.update()

此外,可以使用 counter formatting 和底层 Blessed Terminalcolor capabilities 来为进度条的任何部分着色。

import enlighten

manager = enlighten.get_manager()

# Standard bar format
std_bar_format = u'{desc}{desc_pad}{percentage:3.0f}%|{bar}| ' + \
                 u'{count:{len_total}d}/{total:d} ' + \
                 u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]'

# Red text
bar_format = manager.term.red(std_bar_format)

# Red on white background
bar_format = manager.term.red_on_white(std_bar_format)

# X11 colors
bar_format = manager.term.peru_on_seagreen(std_bar_format)

# RBG text
bar_format = manager.term.color_rgb(2, 5, 128)(std_bar_format)

# RBG background
bar_format = manager.term.on_color_rgb(255, 190, 195)(std_bar_format)

# RGB text and background
bar_format = manager.term.on_color_rgb(255, 190, 195)(std_bar_format)
bar_format = manager.term.color_rgb(2, 5, 128)(bar_format)

# Apply color to select parts
bar_format = manager.term.red(u'{desc}') + u'{desc_pad}' + \
             manager.term.blue(u'{percentage:3.0f}%') + u'|{bar}|'

# Apply to counter
ticks = manager.counter(total=100, desc='Ticks', unit='ticks', bar_format=bar_format)

如果将 color 选项应用于 Counter,它将覆盖任何应用的文本颜色。

多彩色

进度条的条形组件可以是多彩色的,以便在单个进度条中跟踪多个类别。

颜色将按照它们添加的顺序从右到左绘制。

默认情况下,当使用多彩色进度条时,bar_format 可用字段增加。

  • count_n (int) - 当前 count

  • count_0(int) - 减去所有子计数器的计数后的剩余计数

  • count_00 (int) - 所有子计数器的计数总和

  • percentage_n (float) - 完成百分比

  • percentage_0(float) - 减去所有子计数器的百分比后的剩余百分比

  • percentage_00 (float) - 所有子计数器的百分比总和

当使用 Counter.add_subcounter 并将 all_fields 设置为 True 时,子计数器将具有额外的字段

  • eta_n (str) - 完成估计时间

  • rate_n (浮点数) - 自父对象创建以来每秒的平均增量

有关bar_format的更多信息,请参阅API的格式部分。

多色进度条的一个用例是记录一系列测试的状态。在此示例中,失败为红色,错误为白色,成功为绿色。每个状态的数量都列在进度条中。

import random
import time
import enlighten

bar_format = u'{desc}{desc_pad}{percentage:3.0f}%|{bar}| ' + \
            u'S:{count_0:{len_total}d} ' + \
            u'F:{count_2:{len_total}d} ' + \
            u'E:{count_1:{len_total}d} ' + \
            u'[{elapsed}<{eta}, {rate:.2f}{unit_pad}{unit}/s]'

manager = enlighten.get_manager()
success = manager.counter(total=100, desc='Testing', unit='tests',
                            color='green', bar_format=bar_format)
errors = success.add_subcounter('white')
failures = success.add_subcounter('red')

while success.count < 100:
    time.sleep(random.uniform(0.1, 0.3))  # Random processing time
    result = random.randint(0, 10)

    if result == 7:
        errors.update()
    if result in (5, 6):
        failures.update()
    else:
        success.update()

更复杂的例子是记录进程启动。在这种情况下,所有项目都将从红色开始,过渡到黄色,最终全部变为绿色。计数、百分比、速率和eta字段都是从第二个子计数器中得出的。

import random
import time
import enlighten

services = 100
bar_format = u'{desc}{desc_pad}{percentage_2:3.0f}%|{bar}|' + \
            u' {count_2:{len_total}d}/{total:d} ' + \
            u'[{elapsed}<{eta_2}, {rate_2:.2f}{unit_pad}{unit}/s]'

manager = enlighten.get_manager()
initializing = manager.counter(total=services, desc='Starting', unit='services',
                                color='red', bar_format=bar_format)
starting = initializing.add_subcounter('yellow')
started = initializing.add_subcounter('green', all_fields=True)

while started.count < services:
    remaining = services - initializing.count
    if remaining:
        num = random.randint(0, min(4, remaining))
        initializing.update(num)

    ready = initializing.count - initializing.subcount
    if ready:
        num = random.randint(0, min(3, ready))
        starting.update_from(initializing, num)

    if starting.count:
        num = random.randint(0, min(2, starting.count))
        started.update_from(starting, num)

    time.sleep(random.uniform(0.1, 0.5))  # Random processing time

其他示例

自定义

Enlighten高度可配置。有关修改输出的信息,请参阅系列格式部分,以及Counter文档。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

enlighten-1.12.4.tar.gz (67.4 kB 查看哈希值)

上传时间

构建分发

enlighten-1.12.4-py2.py3-none-any.whl (41.9 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面