pyproject.toml 中 build-system 必须包含 requires 和 build-backend 两个字段:requires 是构建时依赖列表,build-backend 指定构建后端实现,缺一则导致构建失败。

直接用 build-system.requires 和 build-system.build-backend 就能定义构建系统,不需要 setup.py 或 setup.cfg —— 但必须确保依赖声明准确、backend 兼容当前 Python 版本。
pyproject.toml 中 build-system 必须包含哪两个字段?
只有两个字段是强制的:requires(声明构建时依赖)和 build-backend(指定调用哪个 backend 实现构建逻辑)。缺一不可,否则 pip build 或 python -m build 会报错 Invalid pyproject.toml config: missing 'build-system' section 或更具体的 missing 'requires'。
-
requires是字符串列表,至少得包含 backend 自身(比如"setuptools>=61.0"),不能写成"setuptools"—— 太老的版本不支持 PEP 517 -
build-backend是字符串,常见值有"setuptools.build_meta"、"hatchling.build"、"flit_core.buildapi";注意路径大小写和下划线,写成"setuptools.build_meta:__legacy__"会失败 - 如果项目用 Poetry 管理依赖但不用它构建(比如只用它做 lock 和 publish),
build-backend仍需指向标准 backend,不能填"poetry.core.masonry.api"(已弃用)
为什么 pip install . 有时忽略 pyproject.toml 里的 build-system?
根本原因是当前环境里没有安装 build-system.requires 所列的依赖。pip 在构建前会尝试在临时环境中安装这些依赖,但如果网络受限、index 配置错误,或某些包(如 scikit-build-core)需要额外 wheel 构建工具,就会静默回退到旧式逻辑(比如找 setup.py),甚至直接失败。
对话式AI短视频创作工具:用户提出想法,Agent生成脚本,人工确认后自动生成MP4。触发条件:①制作视频/短视频;②AI旁白视频;③认知自述/播客风格视频;④文稿转视频。仅出现“视频”“TTS”“语音”等模糊词时不激活(可能是其他需求)。
- 典型错误信息:
ModuleNotFoundError: No module named 'setuptools.build_meta',说明requires里写了"setuptools>=61.0",但实际安装的是 58.x - 用
python -m pip install --upgrade build再试,比单纯升级 setuptools 更可靠,因为build包自带兼容性检查 - CI/CD 中建议显式运行
python -m build --wheel --no-isolation来跳过隔离环境,避免因缓存或权限导致 requires 安装失败
不同 build-backend 对 pyproject.toml 的配置项支持差异大吗?
非常大。同一份 pyproject.toml 换个 build-backend 可能完全不生效,因为 backend 只读自己约定的 table(如 [project] 是通用的,但 [tool.setuptools]、[tool.hatch]、[tool.flit.metadata] 互不兼容)。
立即学习“Python免费学习笔记(深入)”;
-
setuptools向后兼容强,能读[tool.setuptools]和部分[project],但若用了[tool.hatch.build.targets.wheel]就直接无视 -
hatchling默认只认[project]和[tool.hatch],不解析[tool.setuptools];想用include-package-data = true得改写成[tool.hatch.build.targets.wheel] include = ["**/*.txt"] - 第三方插件(如
setuptools-scm)必须在requires里声明,且对应配置要放在[tool.setuptools]下,[project]里写dynamic = ["version"]不足以触发它
最容易被忽略的是:即使 pyproject.toml 语法完全合法,只要 build-backend 实现没加载对应插件或配置表,那些字段就只是注释。调试时优先查 backend 文档里「supported configuration sections」,而不是假设「写了就能用」。

















