跳转到主要内容

人类的进度工具

项目描述

进度条 - 蛇的进度工具

Build Status

Coverage Status

                /----------------------------------------------------------------------------------\
                |                                                                                  |
      @..@     /| [###.......] Progress: 34.2MB / 125.8MB |  25.0% | Time: 14min3s | ETA: 19min52s |
     (----)   / |                                                                                  |
    ( >__< )    \----------------------------------------------------------------------------------/
    ^^ ~~ ^^

进度条是一个小型的进度指示工具,用于快速原型设计。为什么叫进度条呢?因为它通常是一个条形图,它会跳到你的终端上,这就是原因!

  • 不会打断你的工作流程(在大多数情况下,无需调用进度条来渲染自身)
  • 它可以猜测你是否在迭代一个列表(或类似的可迭代对象)...
  • 或者迭代一个文件...
  • 或者迭代生成器 - 假设你知道它的总长度...
  • 或者不是!(没有eta,没有总步骤,没有百分比,只有一个指示器而不是条形图,但它仍然可以工作!)
  • 并且你可以轻松地教它如何在使用lxml解析时显示大、gzip压缩的xml文件的进度
  • 支持Python 2.6+、Python 3、PyPy
  • 完全测试

迭代示例

迭代一个列表


    >>> import frogress
    >>> items = [1, 2, 3, 4, 5]
    >>> for item in frogress.bar(items):
    ...     pass # do something with item

    [##........] Step 2/5 |  20.0% | Time: 0.1s | ETA: 0.5s

迭代一个文件


    >>> import frogress
    >>> for line in frogress.bar(open('/path/to/file', steps_label='Progress')):
    ...     pass # do something cruel with a line

    [###.......] Progress: 3.2MB / 12.8MB |  25.0% | Time: 14min3s | ETA: 19min52s

迭代生成器


    >>> import frogress
    >>> count = 100
    >>> items = range(count)
    >>> for item in frogress.bar(items, steps=count):
    ...     pass # do something with item

    [#########.] Step 86/100 |  86.0% | Time: 1.2s | ETA: 7.3s

迭代一个未知总步骤数的生成器


    >>> import frogress
    >>> def counter():
    ...     num = 1
    ...     while True:
    ...         yield num
    ...         num += 1
    ...
    >>> items = counter()
    >>> for item in frogress.bar(items):
    ...     pass # do something with item

    [........#.] Step: 1410 | Time: 2min14s
    [.........#] Step: 1411 | Time: 2min15s
    [........#.] Step: 1412 | Time: 2min16s
    [.......#..] Step: 1413 | Time: 2min17s

使用lxml迭代gzip压缩的xml文件

如何呈现正在处理的文件的进度的问题是frogress应从哪个来源提取进度信息。我们可以尝试以这种方式(不知道已处理的文件有多少内容)或给进度条一个来源

简单方法


    >>> import frogress
    >>> import gzip
    >>> from lxml.etree import iterparse
    >>> stream = gzip.open('my-fat.xml.gz')
    >>> context = iterparse(stream)
    >>> for action, element in frogress.bar(context):
    ...     pass # do something with element
    ...     element.clear() # don't forget about the memory!

    [...#......] Progress: 41923 | Time: 1h42min

这完全没问题:我们传递了一个不提供总处理项目信息的可迭代对象 - 因此我们有一个活动指示器,没有总步骤数,也没有eta。

然而,显然有一种方法可以检索这些信息——毕竟这只是一个正在处理的文件。并且该文件应作为 source 参数传递给 frogress.bar 函数。

传递源


    >>> import frogress
    >>> import gzip
    >>> from lxml.etree import iterparse
    >>> stream = gzip.open('my-fat.xml.gz')
    >>> context = iterparse(stream)
    >>> for action, element in frogress.bar(context, source=stream.myfileobj):
    ...     pass # do something with element
    ...     element.clear() # don't forget about the memory!

    [#####.....] Progress: 73.5MB / 156.4MB |  47.3% | Time: 1h42min | ETA: 1h53min

只需记住传递实际处理的文件,而不是包装器!标准文件将直接传递,但在示例中,gzip 模块将其正在处理的流包装,并且它作为属性 myfileobj 可用。另一方面,bz2 模块不会包装流。等等。frogress 可以猜测一个流是否为类似文件的对象,但传递适当的源是用户的责任。

没有实际可迭代的旋转器

有时我们只想表明程序正在做某事,但我们真的不知道它需要多长时间(例如,执行几个 API 请求)。

示例

import frogress
import time

def cmd(s=0):
    time.sleep(s)


def main():
    with frogress.spinner("Waiting for response 1", done="OK"):
        cmd(0.5)
    with frogress.spinner("Waiting for response 2", done="Done"):
        cmd(0.5)
    with frogress.spinner("Waiting for response 3", done="All done, really!"):
        cmd(0.5)

main()

demo-multi-commands-simple

进度条类 API

大多数时候,您不需要直接调用这些 API —— frogress.bar 函数应该适用于大多数用例。但是,如果您觉得需要做一些定制,这里有一些示例。


    >>> import frogress
    >>> items = [1, 2, 3, 4, 5]
    >>> progressbar = frogress.Bar(items)
    >>> progressbar.step
    0
    >>> progressbar.started # it's still None
    >>> progressbar.finished # here too
    >>> for item in progressbar:
    ...     pass # process the item (it will draw progressbar during iteration)
    >>> progressbar.step
    5
    >>> progressbar.widgets
    [<BarWidget>, <ProgressWidget>, <PercentageWidget>, <EtaWidget>, <TimeWidget>]
    >>> len(progressbar)
    5
    >>> progressbar.output
    <open file '<stderr>', mode 'w' at 0x103df61e0>
    >>> progressbar.started
    datetime.datetime(2013, 5, 12, 22, 2, 26, 752454)
    >>> progressbar.finished
    datetime.datetime(2013, 5, 12, 22, 2, 26, 792901)

技巧 & 技巧

如何更改进度小部件的标签


    >>> import frogress
    >>> items = [1, 2, 3, 4, 5]
    >>> widgets = [frogress.BarWidget, frogress.ProgressWidget('Items: '), frogress.TimerWidget]
    >>> for item in frogress.bar(items, widgets=widgets):
    >>>     pass


项目详情


下载文件

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

源分发

frogress-0.10.1.tar.gz (19.3 kB 查看哈希值)

上传时间

构建分发

frogress-0.10.1-py3-none-any.whl (15.2 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面