跳转到主要内容

A Python Progressbar library to provide visual (yet text based) progress to long running operations.

项目描述

构建状态

python-progressbar test status

覆盖率

https://coveralls.io/repos/WoLpH/python-progressbar/badge.svg?branch=master

安装

该软件包可以通过 pip (这是推荐的方法) 进行安装

pip install progressbar2

如果 pip 不可用,则 easy_install 也可以正常工作

easy_install progressbar2

或者从 Pypi (https://pypi.python.org/pypi/progressbar2) 或 Github 下载最新版本。

请注意,Pypi 上的版本是用我的 GPG 密钥签名的 (https://pgp.mit.edu/pks/lookup?op=vindex&search=0xE81444E9CE1F695D),可以使用 GPG 进行验证

gpg –verify progressbar2-<version>.tar.gz.asc progressbar2-<version>.tar.gz

简介

文本进度条通常用于显示长时间运行操作的状态,提供正在处理的有形提示。

进度条基于现在已废弃的 Google Code 上发布的旧 Python 进度条包。由于该项目的开发者已经完全放弃该项目,并且开发者没有回复邮件,我决定分叉该包。这个包仍然与原始进度条包向后兼容,因此您可以安全地将其用作现有项目的直接替代。

ProgressBar 类管理当前进度,行格式由多个小部件给出。小部件是一个可能根据进度条状态显示不同的对象。有许多类型的小部件

进度条模块非常易于使用,功能强大。它还会自动启用系统支持时自动调整大小等特性。

已知问题

  • Jetbrains (PyCharm 等) 编辑器开箱即用,但对于多行支持等更高级功能,您需要在运行对话框中启用“在输出控制台中启用终端”复选框。

  • IDLE 编辑器根本不支持此类进度条:https://bugs.python.org/issue23220

  • Jupyter 笔记本缓冲区 sys.stdout 可能导致输出混合。此问题可以使用以下方法轻松解决:import sys; sys.stdout.flush()。相关链接: https://github.com/WoLpH/python-progressbar/issues/173

使用方法

Python Progressbar 有许多使用方法,这里展示了几个基本示例,但示例文件中还有更多。

包裹可迭代对象

import time
import progressbar

for i in progressbar.progressbar(range(100)):
    time.sleep(0.02)

带有日志的进度条

带有日志的进度条需要在初始化 StreamHandler 之前将 stderr 重定向。为确保 stderr 流及时重定向,请在初始化 logger 之前调用 progressbar.streams.wrap_stderr()

强制提前初始化的一个选项是使用 WRAP_STDERR 环境变量,在 Linux/Unix 系统中可以通过以下方式实现:

# WRAP_STDERR=true python your_script.py

如果您需要在包裹时手动刷新,可以使用

import progressbar

progressbar.streams.flush()

在大多数情况下,以下方法也可以正常工作,只要您在包裹之后初始化 StreamHandler

import time
import logging
import progressbar

progressbar.streams.wrap_stderr()
logging.basicConfig()

for i in progressbar.progressbar(range(10)):
    logging.error('Got %d', i)
    time.sleep(0.2)

多个(线程化)进度条

import random
import threading
import time

import progressbar

BARS = 5
N = 50


def do_something(bar):
    for i in bar(range(N)):
        # Sleep up to 0.1 seconds
        time.sleep(random.random() * 0.1)

        # print messages at random intervals to show how extra output works
        if random.random() > 0.9:
            bar.print('random message for bar', bar, i)


with progressbar.MultiBar() as multibar:
    for i in range(BARS):
        # Get a progressbar
        bar = multibar[f'Thread label here {i}']
        # Create a thread and pass the progressbar
        threading.Thread(target=do_something, args=(bar,)).start()

上下文包装器

import time
import progressbar

with progressbar.ProgressBar(max_value=10) as bar:
    for i in range(10):
        time.sleep(0.1)
        bar.update(i)

结合进度条和打印输出

import time
import progressbar

for i in progressbar.progressbar(range(100), redirect_stdout=True):
    print('Some text', i)
    time.sleep(0.1)

未知长度的进度条

import time
import progressbar

bar = progressbar.ProgressBar(max_value=progressbar.UnknownLength)
for i in range(20):
    time.sleep(0.1)
    bar.update(i)

自定义小部件的条形图

import time
import progressbar

widgets=[
    ' [', progressbar.Timer(), '] ',
    progressbar.Bar(),
    ' (', progressbar.ETA(), ') ',
]
for i in progressbar.progressbar(range(20), widgets=widgets):
    time.sleep(0.1)

宽中文字符(或其他多字节字符)的条形图

# vim: fileencoding=utf-8
import time
import progressbar


def custom_len(value):
    # These characters take up more space
    characters = {
        '进': 2,
        '度': 2,
    }

    total = 0
    for c in value:
        total += characters.get(c, 1)

    return total


bar = progressbar.ProgressBar(
    widgets=[
        '进度: ',
        progressbar.Bar(),
        ' ',
        progressbar.Counter(format='%(value)02d/%(max_value)d'),
    ],
    len_func=custom_len,
)
for i in bar(range(10)):
    time.sleep(0.1)

并行显示多个独立进度条

import random
import sys
import time

import progressbar

BARS = 5
N = 100

# Construct the list of progress bars with the `line_offset` so they draw
# below each other
bars = []
for i in range(BARS):
    bars.append(
        progressbar.ProgressBar(
            max_value=N,
            # We add 1 to the line offset to account for the `print_fd`
            line_offset=i + 1,
            max_error=False,
        )
    )

# Create a file descriptor for regular printing as well
print_fd = progressbar.LineOffsetStreamWrapper(lines=0, stream=sys.stdout)

# The progress bar updates, normally you would do something useful here
for i in range(N * BARS):
    time.sleep(0.005)

    # Increment one of the progress bars at random
    bars[random.randrange(0, BARS)].increment()

    # Print a status message to the `print_fd` below the progress bars
    print(f'Hi, we are at update {i+1} of {N * BARS}', file=print_fd)

# Cleanup the bars
for bar in bars:
    bar.finish()

# Add a newline to make sure the next print starts on a new line
print()

当然,我们也可以从不同的线程中这样做

import random
import threading
import time

import progressbar

BARS = 5
N = 100

# Create the bars with the given line offset
bars = []
for line_offset in range(BARS):
    bars.append(progressbar.ProgressBar(line_offset=line_offset, max_value=N))


class Worker(threading.Thread):
    def __init__(self, bar):
        super().__init__()
        self.bar = bar

    def run(self):
        for i in range(N):
            time.sleep(random.random() / 25)
            self.bar.update(i)


for bar in bars:
    Worker(bar).start()

print()

项目详情


发布历史 发布通知 | RSS 源

下载文件

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

源代码分发

progressbar2-4.5.0.tar.gz (101.4 kB 查看哈希值)

上传时间 源代码

构建分发

progressbar2-4.5.0-py3-none-any.whl (57.1 kB 查看哈希值)

上传时间 Python 3

由以下提供支持