eprogress 是一个简单、易用的基于Python3的命令行(terminal)进度条库,可以自由选择使用单行显示、多行显示进度条或转圈加载方式,也可以混合使用。

示例

  • 单行进度条

  • 多行进度条

  • 圆形加载

  • 混合显示

特性

  • 使用简单,实例化一个Progress对象,调用update方法即可刷新进度
  • 不依赖任何第三方库。
  • 可定制进度符号,title,显示宽度,个性化显示。
  • 多行、单行显示进度、圆形转圈加载随意搭配。
  • 多线程安全,可在多个线程中更新进度条。

使用方法

  1. 导入eprogress

python from eprogress import LineProgress, CircleProgress, MultiProgressManager

  1. 实例化进度条对象,更新进度

```py
# circle loading
circle_progress = CircleProgress(title='circle loading')
for i in range(1, 101):
circle_progress.update(i)
time.sleep(0.1)

# line progress
line_progress = LineProgress(title='line progress')
for i in range(1, 101):
line_progress.update(i)
time.sleep(0.05)
# multi line or circle loading progress
progress_manager = MultiProgressManager()
progress_manager.put(str(1001), LineProgress(total=100, title='1 thread'))
progress_manager.put(str(1002), LineProgress(total=100, title='2 thread'))
progress_manager.put(str(1003), LineProgress(total=100, title='3 thread'))
progress_manager.put(str(1004), CircleProgress(title='4 thread'))

... ...

progress_manager.update(key, progress)
```

  • 圆形加载条使用update(progress)实例方法进行刷新,只有当参数大于0时才会转动。

  • 线性进度条使包含4个可选参数:

    python @param total : 进度总数 @param symbol : 进度条符号 @param width : 进度条展示的长度 @param title : 进度条前面展示的文字
    创建实例后调用update(progress)实例方法更新进度。

  • 多行进度显示使用MultiProgressManager类,实例化该类,调用put(key,progressBar)方法统一管理多个进度条,内部使用一个dict来收集进度条,多行显示的顺序为put的顺序。更新某个进度条时使用progressMangager的update(key,progress)方法,该key为put进度条时使用的key。

  • 无论是使用多行进度条混合还是使用单行进度条,都不用考虑多线程更新的问题,内部已用Lock()加锁。

  • 详细样例请看源码:Sample源码

原理

  • 利用\r使光标回到本行的行首位置,不使用Python的print()函数,该函数会自动换行,当然你也可以指定print()函数的end参数让其不换行,如:

py print('Complete',end='')

我这里使用sys.stdout.write()来输出字符:

py sys.stdout.write('Complete')

  • 使用ANSI终端指令码\033[K清除光标后面的字符。

  • 使用\033[F使用光标回到上一行,这里要注意,光标回到上一行后下面的一行会被清除。

  • 使用threading.Lock()加锁,在多线程更新进度时确保安全。

  • 抽象类ProgressBar下面有两个子类,分别为LineProgress和 CircleProgress,可单独使用这两个子类来显示单行的进度条。

  • 多行显示进度条时使用MultiProgressManager类来管理,把ProgressBar实现类put到MultiProgressManager类里面,用dict来管理,MultiProgressManager提供统一的update(key,progress)实例方法来指定更新哪一行的进度条。

  • 详细请看源码:Sample源码

注意事项

  • 请在Python3环境下使用。
  • 请不要IDE的运行方式使用,需在终端(terminal)下使用。

源码

作者:竹尘居士

源码地址:https://github.com/homgwu/eprogress

一个简单、易用的Python命令行(terminal)进度条库的更多相关文章

  1. laravel 命令行输出进度条

    有时候我们想在命令行执行一些耗时的命令,我们可以利用 symfony 提供的进度条相关的类,来输出一个进度条,显示当前的处理进度. 参考:http://symfony.com/doc/current/ ...

  2. Python学子之如何退出python 命令行

    python命令行是新手学习python过程中必须要学的一个工具,下面我们来看一下怎么退出python命令行. 工具/原料 python2.7 方法/步骤 1.我们这里使用的是python3.6版本, ...

  3. Python 命令行之旅 —— 初探 argparse

    『讲解开源项目系列』启动--让对开源项目感兴趣的人不再畏惧.让开源项目的发起者不再孤单.跟着我们的文章,你会发现编程的乐趣.使用和发现参与开源项目如此简单.欢迎联系我们给我们投稿,让更多人爱上开源.贡 ...

  4. 让你如绅士般基于描述编写 Python 命令行工具的开源项目:docopt

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  5. 用什么库写 Python 命令行程序?看这一篇就够了

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  6. 快速上手 Python 命令行模块 Click

    关于Click? 说下 Click 模块是干啥的,简单说,它就是把我们的 Python 脚本的一些函数,通过 添加带有 Click 关键字的装饰器进行装饰进而将函数调用的形式转化为命令行传参的形式然后 ...

  7. Python命令行参数及文件读出写入

    看完了柯老板的个人编程作业,虽然是评测组不用做此次作业,但还是想对本次作业涉及到利用Python命令行参数以及进行文件读出写入操作做一个简单的总结.(个人编程作业还是想自己能敲一敲,毕竟我的码力还是小 ...

  8. 分享一个简单易用的RPC开源项目—Tatala

    http://zijan.iteye.com/blog/2041894 这个项目最早(2008年)是用于一个网络游戏的Cache Server,以及一个电子商务的Web Session服务.后来不断增 ...

  9. 一个简单易用的容器管理平台-Humpback

    什么是Humpback? 在回答这个问题前,我们得先了解下什么的 Docker(哦,现在叫 Moby,文中还是继续称 Docker). 在 Docker-百度百科 中,对 Docker 已经解释得很清 ...

随机推荐

  1. 记住 Python 变量类型的三种方式

    title: 记住变量类型的三种方式 date: 2017-06-11 15:25:03 tags: ['Python'] category: ['Python'] toc: true comment ...

  2. matplotlib.pyplot.hist

    **n, bins, patches = plt.hist(datasets, bins, normed=False, facecolor=None, alpha=None)** ## 函数说明 用于 ...

  3. JavaScript中的string对象及方法

    string对象 string对象的两种创建 var a="hello"; var b=new String("hello"); //下面是方法 //charA ...

  4. Access denied for user 'root'@'localhost' (using password: NO)错误的解决方案

    在windows下使用PHP连接MYSQL数据库,确定MYSQL的服务已经启动了,而且Workbench也是可以连上去的,但是始终网页测试都提示Access Denied. 最终解决办法: set p ...

  5. 关于MATLAB处理大数据坐标文件2017527

    第一次提交数据: 今天用了8个特征,加上的这一个特征是 从3000条测试数据中测试失败的数据总结出来的树的数目为50再次使用3000条测试数据测试结果-- 结果不错: 99%但是运行官网数据结果分数- ...

  6. svn命令行便捷代码

    在把分支merge回主干的时候,有时候需要只提交自己修改过的文件,但是很多文件其实分支上没动过,但却显示有变化,这个其实是属性发生了变化.svn通过svn:mergeinfo来记录merge的记录.所 ...

  7. promise(3) '静态'方法

    要是人没有梦想,跟咸鱼又有什么两样了?一直恐惧读源码,哪怕是一个简单的库也是读百来行遇到难点就放弃了.对于新的东西也仅仅是知道它拿来干什么,社区资源在哪里,要用时就突击文档资源使用即可.未有过深入之心 ...

  8. MySQL数据表的创建、查看、插入

    数据表:数据表(或称表)是数据库最重要的组成部分之一,是其他对象的基础.     1.首先我们打开一个数据库(这里我打开的是新创建的一个aaa数据库). 打开数据库:use + 数据库名;     2 ...

  9. 小程序之发起请求 wx.request(object)的坑

    这是官方的API,然后官方的实例中 wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, header: { ...

  10. EntityFramework.Extended.Update.Ambiguous column name

    异常描述 c#代码 dbcontext.Table.Where(x => x.B > 0).Update( x => new Table() { A = x.B } )  抛出异常: ...