pyproject.toml 可完全替代 setup.py,但必须正确声明 [build-system] 的 build-backend 和 requires,并将元数据移至 [project] 段落,否则 pip install -e 或构建会失败。

pyproject.toml 可以完全替代 setup.py,但不是简单“删掉 setup.py 就行”——它需要正确声明构建后端,并迁移所有元数据和配置,否则 pip install -e 或构建会失败。
pyproject.toml 必须声明 build-backend 才能生效
仅把 setup.py 里的内容抄进 pyproject.toml 不起作用。Python 在 PEP 517 后默认只认 build-backend 配置,没有它就回退到旧逻辑(可能仍尝试找 setup.py)。
-
build-backend推荐用setuptools.build_meta(兼容性最好)或setuptools(较新版本) - 必须同时声明
requires,列出构建依赖,比如["setuptools>=61.0", "wheel"] - 如果项目用了
poetry或hatch,对应 backend 和 requires 要换掉,不能混用
项目元数据要从 [project] 段落写,不是 [tool.setuptools]
PEP 621 规定了标准字段位置:name、version、description、dependencies 等都必须放在 [project] 下;[tool.setuptools] 只放 setuptools 特有配置(如 include-package-data、packages 发现规则)。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
-
version不再支持attr:动态读取(如attr: mypkg.__version__),得用dynamic.version+[tool.setuptools.dynamic.version]配合attr或file源 -
dependencies是列表,格式为["requests>=2.25.0", "click"],不支持install_requires=...这种键值写法 - 如果你之前靠
find_packages()自动发现包,现在要显式写[tool.setuptools.packages.find]并设where = ["src"](如果用了 src-layout)
setup.py 删除前务必验证可构建和可安装
删掉 setup.py 后,常见失败场景包括:本地开发时 pip install -e . 报错、CI 中 python -m build 生成的 wheel 缺模块、或者 import mypkg 找不到。
- 运行
python -m build --wheel看是否成功生成dist/*.whl,再用pip install dist/*.whl测试安装后 import 是否正常 - 开发模式下优先用
pip install -e . --config-settings editable-verbose=true查看 setuptools 如何解析包结构 - 如果用了
MANIFEST.in,它仍会被读取,但更推荐迁移到[tool.setuptools.manifest]或直接用[project.files](注意该字段尚未被广泛支持)
最易被忽略的是动态 version 和包路径配置——尤其当项目结构不是标准 flat layout 时,packages 不显式声明或 find 配置错一个字段,pip install -e . 就静默失败,连报错都不给。动手前先跑通 build 和 install -e 两个环节,比改完一堆 TOML 却卡在 import 更省时间。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










