Migrate Python projects from setup.py/setup.cfg to pyproject.toml for use with uv. Use when upgrading legacy Python packaging, converting setup.py to modern pyproject.toml format, setting up dependency groups for development/testing, and ensuring `uv run pytest` works correctly.
Migrate legacy Python packaging to modern pyproject.toml with uv compatibility.
[project]
name = "package-name"
version = "0.1.0"
description = "Package description"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"requests>=2.28",
]
license = "Apache-2.0"
[project.urls]
Homepage = "https://github.com/user/repo"
Changelog = "https://github.com/user/repo/releases"
Issues = "https://github.com/user/repo/issues"
CI = "https://github.com/user/repo/actions"
[dependency-groups]
dev = [
"pytest>=9.0",
"black>=25.12.0",
]
[build-system]
requires = ["uv_build>=0.9.18,<0.10.0"]
build-backend = "uv_build"
Map setup() arguments to [project] table:
name → nameversion → versiondescription → descriptionlong_description → readme (use filename)author + author_email → authors = [{name = "...", email = "..."}]url → project.urls.Homepagepython_requires → requires-pythoninstall_requires → dependenciesentry_points.console_scripts → [project.scripts]Critical for uv run pytest to work:
[dependency-groups]
dev = [
"pytest>=9.0",
"black>=25.12.0",
]
Then run tests with:
uv run pytest
The dev group will be picked up automatically by uv run.
Test that building the package works correctly:
uv build
uv_build defaults to src/ layout. For flat layout (package directory at project root), add:
[tool.uv.build-backend]
module-root = ""
setup.pysetup.cfgMANIFEST.in (usually, unless complex includes)requirements.txt / requirements-dev.txt (optional, uv manages these)