Skip to content
Easy to use progress bars for Python
Branch: master
Clone or download
verigak Merge pull request #69 from frasern/atexit
Fixed #64 -- ensure hidden cursor is reshown at exit.
Latest commit 1ed4142 Jul 2, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
progress Fixed #64 -- ensure hidden cursor is reshown at exit. Jun 4, 2019
.gitignore Initial commit Apr 18, 2012
LICENSE Initial commit Apr 18, 2012 Include tests in PyPI tarball Oct 10, 2018
README.rst Add Pypi link and instuctions to ReadMe Oct 11, 2018
demo.gif Add a demo gif Jan 28, 2016 Fix copy paste typo Apr 10, 2017 Fold the mixins in Sep 13, 2018


Easy progress reporting for Python




There are 7 progress bars to choose from:

  • Bar
  • ChargingBar
  • FillingSquaresBar
  • FillingCirclesBar
  • IncrementalBar
  • PixelBar
  • ShadyBar

To use them, just call next to advance and finish to finish:

from import Bar

bar = Bar('Processing', max=20)
for i in range(20):
    # Do some work

or use any bar of this class as a context manager:

from import Bar

with Bar('Processing', max=20) as bar:
    for i in range(20):
        # Do some work

The result will be a bar like the following:

Processing |#############                   | 42/100

To simplify the common case where the work is done in an iterator, you can use the iter method:

for i in Bar('Processing').iter(it):
    # Do some work

Progress bars are very customizable, you can change their width, their fill character, their suffix and more:

bar = Bar('Loading', fill='@', suffix='%(percent)d%%')

This will produce a bar like the following:

Loading |@@@@@@@@@@@@@                   | 42%

You can use a number of template arguments in message and suffix:

Name Value
index current value
max maximum value
remaining max - index
progress index / max
percent progress * 100
avg simple moving average time per item (in seconds)
elapsed elapsed time in seconds
elapsed_td elapsed as a timedelta (useful for printing as a string)
eta avg * remaining
eta_td eta as a timedelta (useful for printing as a string)

Instead of passing all configuration options on instatiation, you can create your custom subclass:

class FancyBar(Bar):
    message = 'Loading'
    fill = '*'
    suffix = '%(percent).1f%% - %(eta)ds'

You can also override any of the arguments or create your own:

class SlowBar(Bar):
    suffix = '%(remaining_hours)d hours remaining'
    def remaining_hours(self):
        return self.eta // 3600


For actions with an unknown number of steps you can use a spinner:

from progress.spinner import Spinner

spinner = Spinner('Loading ')
while state != 'FINISHED':
    # Do some work

There are 5 predefined spinners:

  • Spinner
  • PieSpinner
  • MoonSpinner
  • LineSpinner
  • PixelSpinner


Download from PyPi

pip install progress


There are a number of other classes available too, please check the source or subclass one of them to create your own.


progress is licensed under ISC

You can’t perform that action at this time.