Python progress bars

tqdm alternatives: 6 Python progress bar libraries compared

If tqdm 4.70.1 isn't the right fit, rich 15.0.0 and enlighten 1.14.1 are the clearest step-ups for prettier output and several bars at once. alive-progress adds animated bars, click.progressbar saves a dependency in click tools and yaspin covers spinners. All of them draw in your local terminal only, so none can show a bar on another device.

5 min readtqdm and progress bars

At a glance

  • rich 15.0.0 (MIT, Python 3.9+): rich.progress.track() plus a Progress class 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.

LibraryLatest versionLicencePythonGitHub starsSeveral bars at onceBest for
tqdm4.70.1 (2026-09-11)MPL-2.0 AND MIT3.8+about 31,400Yes, with positionLoops, pandas, notebooks, pools
rich15.0.0 (2026-04-12)MIT3.9+about 57,700Yes, Progress tasksPrettier output, custom columns
alive-progress3.3.0 (2025-07-20)MIT3.9+about 6,300No, on its to-do listAnimated bars and spinners
progressbar24.6.0 (2026-08-14)BSD-3-Clause3.10+about 880Yes, MultiBarWidget-based layouts
enlighten1.14.1 (2025-03-10)MPL-2.02.7, 3.5+about 540YesBars under scrolling output
click8.5.0 (2026-08-26)BSD-3-Clause3.10+about 17,800NoBars in click command line tools
yaspin3.5.1 (2026-09-18)MIT3.10+about 900Spinner onlyWork 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:

Python
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.

Python
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.

Python
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.
Python
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.rich and tqdm.notebook widgets are not streamed.
  • Alerts need a run: call start_run(), then notify() with a Discord, Slack or other webhook URL.

How to choose

  • Notebook widgets, pandas progress_apply or process_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 MultiBar on 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.

Get a live linkpip install tqdm-live

Sources