How to migrate from Pipenv to uv
Pipenv combines pip and virtualenv into a single tool. uv covers the same ground and adds Python version management, a standards-compliant pyproject.toml-based workflow, and significantly faster dependency resolution.
Migrating replaces the Pipfile and Pipfile.lock with pyproject.toml and uv.lock, and swaps pipenv commands for their uv equivalents.
Automated migration
The migrate-to-uv tool automates the conversion.
1. Run the migration tool
$ uvx migrate-to-uv
The tool reads your Pipfile and:
- Creates a
pyproject.tomlwith[project]metadata and[dependency-groups] - Translates
[packages]todependenciesand[dev-packages]to thedevdependency group - Generates a
uv.lockfile from the resolved dependencies inPipfile.lock - Removes
PipfileandPipfile.lock
2. Verify the result
$ uv sync
$ uv run pytest
Manual migration
If the automated tool doesn’t cover your setup, map Pipfile sections to pyproject.toml by hand.
A typical Pipfile:
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
requests = ">=2.28"
click = ">=8.0"
[dev-packages]
pytest = ">=7.0"
ruff = "*"
[requires]
python_version = "3.11"Becomes:
[project]
name = "my-project"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
"requests>=2.28",
"click>=8.0",
]
[dependency-groups]
dev = [
"pytest>=7.0",
"ruff",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"Key translations:
| Pipfile | pyproject.toml |
|---|---|
[packages] |
[project] dependencies |
[dev-packages] |
[dependency-groups] dev |
[requires] python_version |
[project] requires-python |
[source] (non-default index) |
[[tool.uv.index]] |
"*" (any version) |
omit the version constraint |
After creating pyproject.toml, generate the lockfile:
$ uv lock
$ uv sync
Then delete Pipfile and Pipfile.lock.
Command equivalents
| Pipenv | uv |
|---|---|
pipenv install |
uv sync |
pipenv install requests |
uv add requests |
pipenv install --dev pytest |
uv add --dev pytest |
pipenv uninstall requests |
uv remove requests |
pipenv run python script.py |
uv run python script.py |
pipenv run pytest |
uv run pytest |
pipenv shell |
source .venv/bin/activate |
pipenv lock |
uv lock |
pipenv sync |
uv sync |
pipenv update |
uv lock --upgrade |
pipenv update requests |
uv lock --upgrade-package requests |
pipenv graph |
uv tree |
Tip
pipenv shell spawns a subshell. uv keeps the virtual environment in .venv at the project root. Activate it with source .venv/bin/activate (macOS/Linux) or .venv\Scripts\activate (Windows), or prefix commands with uv run instead of activating.