At a glance
- rich 15.0.0 (MIT, Python 3.9+):
rich.progress.track()plus aProgressclass for several tasks. - enlighten 1.14.1 (MPL-2.0): several bars pinned at the bottom while your prints scroll above them.
- alive-progress 3.3.0 (MIT, Python 3.9+): animated bars and spinners, one bar at a time.
- halo 0.0.31 hasn't had a release since 2020-11-10; use yaspin 3.5.1 for spinners.
Quick comparison
Here is how the libraries compare as of 2026-10-30, using data from PyPI and GitHub. tqdm is in the first row as the baseline: version 4.70.1 (released 2026-09-11), MPL-2.0 AND MIT, Python 3.8+, with notebook widgets, pandas progress_apply and process_map.
| Library | Latest version | Licence | Python | GitHub stars | Several bars at once | Best for |
|---|---|---|---|---|---|---|
| tqdm | 4.70.1 (2026-09-11) | MPL-2.0 AND MIT | 3.8+ | about 31,400 | Yes, with position | Loops, pandas, notebooks, pools |
| rich | 15.0.0 (2026-04-12) | MIT | 3.9+ | about 57,700 | Yes, Progress tasks | Prettier output, custom columns |
| alive-progress | 3.3.0 (2025-07-20) | MIT | 3.9+ | about 6,300 | No, on its to-do list | Animated bars and spinners |
| progressbar2 | 4.6.0 (2026-08-14) | BSD-3-Clause | 3.10+ | about 880 | Yes, MultiBar | Widget-based layouts |
| enlighten | 1.14.1 (2025-03-10) | MPL-2.0 | 2.7, 3.5+ | about 540 | Yes | Bars under scrolling output |
| click | 8.5.0 (2026-08-26) | BSD-3-Clause | 3.10+ | about 17,800 | No | Bars in click command line tools |
| yaspin | 3.5.1 (2026-09-18) | MIT | 3.10+ | about 900 | Spinner only | Work with no known length |
tqdm also ships tqdm.rich, which renders through rich, but it warns that it's experimental. Every library in the table draws only in your local terminal.
rich.progress
rich is a full terminal formatting library rather than a dedicated progress bar package, and at about 57,700 stars it's the biggest project here. For a drop-in loop wrapper like tqdm, use rich.progress.track:
import time
from rich.progress import track
for item in track(range(100), description="Working..."):
time.sleep(0.02)When you need more control, switch to the Progress class. It handles several tasks at once, lets you set up custom columns and supports transient bars that disappear when they finish.
alive-progress
alive-progress focuses on animated bars and spinners, with live throughput and ETA. You can wrap an iterable with alive_it(), or open a context manager with alive_bar() and call bar() for each item as you go.
import time
from alive_progress import alive_bar
with alive_bar(100, title="Working") as bar:
for item in range(100):
time.sleep(0.02)
bar()It shows one bar at a time: simultaneous bars for nested work are still on the project's to-do list, and nested use raises an error.
progressbar2
progressbar2 uses widget-based layouts, so you assemble exactly the readout you want, and it includes MultiBar when you need several bars at once. Watch the names: you install progressbar2, but the import name in your code is progressbar.
enlighten
enlighten is built for scripts that print a lot while they work. It keeps several progress bars and status bars at the bottom of your terminal while normal print() and logging output scrolls above them, with no redirection needed. Jupyter support is marked experimental.
import time
import enlighten
manager = enlighten.get_manager()
files = manager.counter(total=5, desc="files", unit="files")
lines = manager.counter(total=50, desc="lines", unit="lines")
for n in range(5):
for _ in range(10):
time.sleep(0.02)
lines.update()
files.update()
print(f"processed file {n}")
manager.stop()click.progressbar and spinners
If you're already building a command line tool with click, click.progressbar gives you a basic single bar without another package. It won't do several bars at once.
Sometimes you have no total at all, just a step with no known length where a percentage makes no sense:
- yaspin gives you terminal spinners for exactly that case.
- halo is the other spinner library you'll see mentioned, but halo 0.0.31 came out on 2020-11-10 with no release since, and its repository was last updated in June 2024.
import time
from yaspin import yaspin
with yaspin(text="Waiting for the server") as spinner:
time.sleep(2)
spinner.ok("done")A remote view for tqdm, not a replacement
All the libraries above draw in the local terminal, so none of them can send a progress bar to another device. Runpeek takes a different angle: it keeps tqdm as your renderer and adds a browser link per bar or per run, which you can open on a phone.
Know its limits before you pick it:
- Browser links expire 30 minutes after the last update.
- It streams standard tqdm bars only;
rich.progress, alive-progress, progressbar2,tqdm.richandtqdm.notebookwidgets are not streamed. - Alerts need a run: call
start_run(), thennotify()with a Discord, Slack or other webhook URL.
How to choose
- Notebook widgets, pandas
progress_applyorprocess_map: stay with tqdm. - Prettier output, custom columns and transient bars: rich.
- Animated bars and spinners for one task at a time: alive-progress.
- Widget layouts and
MultiBaron Python 3.10+: progressbar2. - Bars pinned at the bottom while print output scrolls above: enlighten.
- A basic bar in a click app:
click.progressbar. - A spinner for work with no known length: yaspin.
- A tqdm run you want to watch from your phone: tqdm plus Runpeek.
For copy-paste starter code for each option, see the Python progress bar guide.
FAQ
Is rich better than tqdm?
rich 15.0.0 is better at presentation: several tasks, custom columns and transient bars through its Progress class. tqdm 4.70.1 is still the better fit if you need notebook widgets, pandas progress_apply or process_map, and its tqdm.rich bridge is marked experimental.
Which progress bar works best in Jupyter?
tqdm, because it ships a dedicated widget bar through tqdm.auto and tqdm.notebook. rich works in notebooks with the rich[jupyter] extra but needs manual refreshes, and enlighten's Jupyter support is experimental.
Can I show several progress bars at once?
Yes. tqdm does it with position, rich with the Progress class, progressbar2 with MultiBar, and enlighten keeps several bars pinned at the bottom of the terminal. alive-progress and click.progressbar show one bar at a time.
Is halo still maintained?
halo 0.0.31 was released on 2020-11-10 and has had no release since, and its repository was last updated in June 2024. For terminal spinners on Python 3.10+, yaspin 3.5.1 (released 2026-09-18) is the maintained option.
Can I see a Python progress bar from my phone?
Not with a terminal library alone, because they only draw in the local terminal. Runpeek's Python package tqdm-live gives a standard tqdm bar a browser link you can open on a phone; links expire 30 minutes after the last update.
Check on long runs from your phone
Change one import and every tqdm bar prints a link you can open on any device. Get a Discord or Slack message when the run finishes, fails or stalls.
pip install tqdm-liveSources
- rich on PyPI pypi.org
- rich progress display documentation rich.readthedocs.io
- alive-progress on GitHub github.com
- progressbar2 on PyPI pypi.org
- enlighten on PyPI pypi.org
- click on PyPI pypi.org
- yaspin on PyPI pypi.org
- halo on PyPI pypi.org
- tqdm on PyPI pypi.org