uv is a single tool that does what pip, venv, pip-tools, pipx, pyenv and Poetry do between them, and does it much faster. If you are starting a new project in 2026 it is the sensible default. If you have a working pip-based setup, the case for switching is real but not urgent.
What uv is#
uv is a package and project manager for Python written in Rust, made by the team behind the ruff linter. One binary handles installing packages, creating virtual environments, locking dependencies, installing Python itself, and running tools in isolation. It is not a new Python; it manages the Python you already have, or downloads one for you.
The same jobs, side by side#
| Task | pip and friends | uv |
|---|---|---|
| Create an environment | python -m venv .venv |
uv venv |
| Install a package | pip install requests |
uv pip install requests or uv add requests |
| Install from a file | pip install -r requirements.txt |
uv pip install -r requirements.txt |
| Lock dependencies | pip-compile (pip-tools) |
uv lock |
| Recreate exactly | pip-sync |
uv sync |
| Run a script | activate, then python app.py |
uv run app.py |
| Install a CLI tool globally | pipx install ruff |
uv tool install ruff |
| Install a Python version | pyenv, or an installer | uv python install 3.13 |
Notice uv pip. uv ships a pip-compatible interface, so you can adopt it one command at a time without changing how your project is laid out.
Two ways to use it#
As a faster pip. Keep your requirements.txt, keep your workflow, prefix commands with uv:
uv venv
source .venv/bin/activate # .venv\Scripts\activate on Windows
uv pip install -r requirements.txt
As a project manager. Let uv own the environment and the lockfile, the way Poetry or npm would:
uv init myproject
cd myproject
uv add requests pandas
uv add --dev pytest
uv run pytest
That writes dependencies to pyproject.toml, produces a uv.lock with exact versions, and creates .venv automatically. uv run uses the environment without you activating it, which removes a whole category of “wrong interpreter” mistakes.
Why it is faster#
Three reasons, none of them tricks:
- A global cache means a package downloaded for one project is linked into the next rather than downloaded again.
- Downloads and installs run in parallel.
- The dependency resolver is written in a compiled language and designed for the problem, rather than being pip’s incremental evolution.
The practical effect is that creating a fresh environment for a typical project takes seconds instead of minutes. That changes behaviour: people recreate environments freely instead of nursing one along for a year.
uv vs venv#
uv venv creates the same kind of virtual environment as python -m venv, faster and without needing pip inside it. You can still activate it the normal way. The difference is only speed and convenience; the environment itself is standard.
uv vs Poetry#
This is the closer comparison, because both manage a project rather than just installing packages.
| Poetry | uv | |
|---|---|---|
| Lockfile | poetry.lock |
uv.lock |
| Config format | Its own [tool.poetry] table, moving to standard |
Standard [project] table |
| Manages Python versions | No | Yes |
| Speed | Adequate | Much faster |
| Maturity | Older, large user base | Newer, growing quickly |
Poetry works well and there is no need to migrate a healthy project. For a new project, uv’s use of the standard pyproject.toml layout and its handling of Python versions make it the simpler choice.
Who should not switch yet#
- Teams with a tuned pip pipeline. Working CI and deployment scripts are worth more than speed. Adopt
uv pipfor the speed and change nothing else. - Anyone following a course or book. Use what the material uses; translating commands as you learn adds friction for no benefit.
- Environments where you cannot install new tools. pip ships with Python; uv does not.
- Projects that depend on pip’s exact resolution behaviour. Rare, but uv occasionally resolves a tricky dependency set differently. Test before switching a large project.
Installing uv#
# macOS and Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows PowerShell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# Or, if you already have pip
pip install uv
Questions people ask#
Is uv a replacement for Python?
No. It manages packages, environments and which Python version a project uses. Your code runs on the ordinary CPython interpreter.
Does uv work with requirements.txt?
Yes. uv pip install -r requirements.txt reads it, and uv pip compile can generate one from pyproject.toml.
Is it stable enough for production?
It is widely used in production and under active development. Pin the uv version in CI as you would any other tool.
Do I still need to activate the environment?
Not if you use uv run. You can still activate it in the traditional way if you prefer.
Where to go next#
- Python virtual environments — what uv is managing for you.
- Python venv not working — the problems
uv runsidesteps. - Python packages explained — what a lockfile pins.