↩ All posts

UV: The Python Package Manager That's Too Fast to Notice

a tool that thinks about your time differently

Patrick Star's Confused DIY with Tools - Spongebob

The Problem That No One Talks About

There is a particular kind of suffering that Python developers have endured for years that almost no one discusses in polite company. I am referring, of course, to the experience of waiting for pip install to do anything.

Picture this: it is 2 AM. You have just remembered that you need a particular library to make your code do something or other, let us say it is requests, because it always is. You type pip install requests, and then you wait. And you wait. And you think about your life choices. You wonder about the meaning of patience. You begin to suspect that somewhere, somehow, the universe is enjoying this.

I have spent what amounts to several entire days of my life watching pip think about whether it should install a package. I am not proud of this, but I suspect I am not alone.

A Brief History of Python Packaging

To understand why UV matters, you need to understand what came before, and I promise this will be brief, because no one wants to read a history lesson.

In the beginning, there was pip. Then came pipenv, Poetry, PDM and Rye. Python has never lacked for options in this department. It is rather like the restaurant that offers seventeen different menus. Eventually, you just want someone to bring you a sandwich.

Enter UV - The Underdog That Could

Let me introduce you to UV (stylized as uv, because developers have strong feelings about capitalization). UV is a Python package manager, written in Rust, created by Astral. Astral is the same outfit that brought you Ruff, the Python linter that made everyone realize they had been waiting unnecessarily for their code to be checked.

Here is what makes UV remarkable: it can replace pip, pip-tools, pipx, poetry, pyenv, twine, and virtualenv. One tool. It is like discovering that your Swiss Army knife also makes coffee.

What UV Actually Does Well

One tool instead of seven

Managing virtualenvs, pip, pipx, pyenv, and tox? Now it is just UV. Less context switching and less waiting.

The uvx command

Running one-off tools without polluting your system is genuinely addictive: uvx black ., uvx ruff check ., uvx http server.

Inline script dependencies

Write a quick Python script, add a little metadata comment at the top saying what it needs, and run it with uv run script.py. It figures out the dependencies, installs them, runs your script, and does not clutter up your system.

Project management

Use uv init projectname to create a project, set up a virtual environment, and generally behave like a helpful assistant.

Python version management

Install multiple versions of Python with uv python install 3.10 3.11 3.12. It takes about three seconds.

Global caching and workspaces

UV uses a global cache for dependencies across projects. If you manage monorepos or multiple related packages, UV workspaces make one uv sync enough.

Getting Started with UV

Here is the beautiful part: you do not have to change how you work.

Installation

The quickest way is via the official installer:

curl -LsSf https://astral.sh/uv/install.sh | sh

Or on Windows:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Your First Commands

Install a package:

uv pip install requests

Create a new project:

uv init projectname

Run a tool without installing it:

uvx ruff check .

Why It Deserves More Love

Here is where I make my case for why UV deserves to be more than a “oh, that is interesting” footnote in developer conversations.

It is easy to switch

You do not have to abandon your existing workflow or learn an entirely new system. Just swap pip for uv pip and notice the difference. It is the equivalent of discovering that the highway has a carpool lane and you were just driving in the slow lane this whole time.

Astral has earned the benefit of the doubt

Ruff, their linter, proved that you could rewrite Python tools in Rust and make them dramatically faster. People said “but Python is fine, why bother?” And then Ruff became the fastest linter anyone had ever seen and everyone switched. It is the same team.

It changes how you work

When installing a package feels effortless, you experiment more. You try new libraries instead of working around them. You become the kind of developer who says “sure, I will just install that” instead of “I will figure out a way to avoid it.”

The little things add up

A global cache means no redundant downloads. Workspaces mean one command for monorepos. Inline dependencies mean scripts that actually work when you share them with someone else. These are not flashy features, but they are the ones that make you realise you have been living with friction you did not notice.

Should You Care?

If you are a beginner who just wants to install pandas and get on with your life: yes, you should care. If you are an experienced developer who has learned to accept that wrestling with package managers is just part of the job, UV is a gentle reminder that we should not have to.

The Honest Verdict

UV is not going to change your life. It is not going to make you a better programmer or solve all your dependency problems. But it will remove a small, persistent source of friction from your work, and those small sources of friction add up.

That someone, somewhere, looked at a problem that everyone had just accepted and thought: this could be better. And they were right.

Written in appreciation of tools that respect your time.