# Setup To Pyproject

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

- Skill: `majiayu000/setup-to-pyproject` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/setup-to-pyproject`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/setup-to-pyproject/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/setup-to-pyproject

---


# Setup.py to pyproject.toml Migration for uv

Migrate legacy Python packaging to modern pyproject.toml with uv compatibility.

## Core Structure

```toml
[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"
```

## Key Migration Steps

### 1. Extract metadata from setup.py

Map setup() arguments to [project] table:
- `name` → `name`
- `version` → `version`
- `description` → `description`
- `long_description` → `readme` (use filename)
- `author` + `author_email` → `authors = [{name = "...", email = "..."}]`
- `url` → `project.urls.Homepage`
- `python_requires` → `requires-python`
- `install_requires` → `dependencies`
- `entry_points.console_scripts` → `[project.scripts]`

### 2. Set up dependency-groups for dev dependencies

**Critical for `uv run pytest` to work:**

```toml
[dependency-groups]
dev = [
    "pytest>=9.0",
    "black>=25.12.0",
]
```

### 3. Confirm it works with uv run

Then run tests with:
```bash
uv run pytest
```
The `dev` group will be picked up automatically by `uv run`.

### 4. Confirm it works with uv build

Test that building the package works correctly:
```bash
uv build
```
`uv_build` defaults to `src/` layout. For **flat layout** (package directory at project root), add:

```toml
[tool.uv.build-backend]
module-root = ""
```

## Files to Delete After Migration

- `setup.py`
- `setup.cfg`
- `MANIFEST.in` (usually, unless complex includes)
- `requirements.txt` / `requirements-dev.txt` (optional, uv manages these)

