pyproject.toml 是现代 Python 项目的“总配置中心”,由 PEP 517/518/621 标准化,用来告诉 pip、poetry、uv 等工具:

“这个项目叫啥、用哪个 Python、依赖谁、怎么构建、黑/测/类型检查工具怎么配”。

替代了过去散落各处的 setup.py + setup.cfg + requirements.txt + pytest.ini + .flake8 那种混乱局面。

它是一个放在项目根目录的 TOML 格式静态文件

它不是“脚本”,不执行 Python 代码,只是“填表”。

# 一、pyproject.toml 语法去哪查(按“查什么”分层)

pyproject.toml 的语法其实由三层叠出来,查的时候别只盯一个页面:

# 1. TOML 基础语法(最底层)

  • 官网:https://toml.io (opens new window)
  • 管的是:键值对、表 [x]、数组、注释、a.b.c 嵌套怎么写
  • TOML 本身对 key/table 的顺序没有任何语义要求

# 2. pyproject.toml 的“标准契约”(Python 官方)

由这些规范定义:

  • PEP 518 → 定义 [build-system][tool] 命名空间
  • PEP 621 → 定义 [project] 表里的标准字段(name/version/dependencies…)
  • Python Packaging User Guide 正式规范页: https://packaging.python.org/en/latest/specifications/declaring-project-metadata (中文镜像:https://packaging.pythonlang.cn/en/latest/specifications/pyproject-toml )
  • 用户向写作指南: https://packaging.python.org/en/latest/guides/writing-pyproject-toml/

# 3. 构建后端扩展字段(setuptools / hatch / poetry…)

  • setuptools 专属:[tool.setuptools] → https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html
  • hatchling:[tool.hatch]
  • poetry:不用 [project],用 [tool.poetry](Poetry 自己的一套)
  • uv / pdm / ruff / mypy / pytest 各自查各自文档,都挂在 [tool.xxx]

✅ 查字段时先问:这字段是 PEP 621 标准TOML 通用,还是 某个后端/工具私有

# 二、配置节点有没有顺序要求?

# 结论先给

TOML 层面:完全无序。

pyproject.toml 规范:顶层表顺序随意,表内 key 顺序也随意。

下面这些都等价、合法、构建结果一样

[tool.ruff]
line-length = 88

[build-system]
requires = ["setuptools>=61"]
build-backend = "setuptools.build_meta"

[project]
name = "demo"
version = "0.1.0"
[project]
name = "demo"
version = "0.1.0"

[build-system]
requires = ["setuptools>=61"]
build-backend = "setuptools.build_meta"

[tool.ruff]
line-length = 88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 但有三条“硬边界”要注意

  1. key 必须待在对的表里
    • requires 只能在 [build-system]
    • dependencies 只能在 [project]
    • line-length 只能在 [tool.ruff] 下,不能提到顶层
  2. 同一个表不能重复定义冲突值(TOML 本身不允许同表同 key 出现两次)
  3. [project]name 必填且不能 dynamic;version 必填或声明 dynamic = ["version"](PEP 621 规定)

# 社区约定俗成的顺序(不是语法要求)

虽然无序,但人和工具都爱看这个顺序,建议你笔记里也这么排:

[build-system]      # 1. 先告诉构建前端怎么建
[project]           # 2. 项目身份证 + 运行依赖
[project.optional-dependencies]
[project.scripts]
[project.urls]
[tool.xxx]          # 3. 黑/测/类型/后端扩展放最后
1
2
3
4
5
6

理由:[build-system]pip install . 最早被读,[project] 是人最关心的,[tool] 是噪音最大的部分。

# 三、一句话写进笔记

pyproject.toml 语法 = TOML 语法 + PEP 518/621 标准表 + 后端/工具私有 [tool.xxx]

所有 table 和 key 顺序均无要求,但 key 必须属于正确的 table;社区习惯按 build-system → project → tool 排。