setuptools中setup.py、setup.cfg与pyproject.toml冲突配置交互问询
核心优先级规则(setuptools)
setuptools加载配置时,优先级从高到低为:setup.py > setup.cfg > pyproject.toml。具体冲突处理逻辑如下:
- 同一配置项(比如包名
name、版本号version)在多个文件中取值不同时,高优先级文件的配置会直接覆盖低优先级的。 - 非冲突的配置项会自动合并,比如setup.cfg里声明的运行依赖和pyproject.toml里指定的构建依赖会各自生效,互不影响。
setup.py与其他文件冲突
setup.py是可执行的Python代码,它的配置优先级是最高的。不管setup.cfg或pyproject.toml里怎么设置,只要setup.py里明确指定了某个配置项(比如setup(name="my-app")),最终生效的就是这个值。
另外,setup.py支持动态生成配置(比如根据环境变量生成版本号),这类动态配置是静态的setup.cfg和pyproject.toml无法覆盖的。
setup.cfg与pyproject.toml冲突
pyproject.toml主要负责指定构建后端(比如[build-system]区块),以及遵循PEP 621规范的元数据([project]区块)。对于setuptools专属的配置(比如setup.cfg里[metadata]下的内容),setup.cfg的优先级高于pyproject.toml的[project]配置。
如果要强制遵循PEP 621规范,让pyproject.toml的[project]优先级更高,需要在pyproject.toml里添加[tool.setuptools] dynamic = []之类的配置,禁用setuptools的传统静态配置优先级。
官方规则说明
setuptools官方文档明确了配置加载顺序:Python代码形式的setup.py优先级最高,其次是setup.cfg的静态配置,最后是pyproject.toml中的相关配置。对于PEP 621兼容的元数据,setuptools会合并pyproject.toml的project表和自身配置,但setup.cfg和setup.py仍拥有最终决定权。
其他构建后端的行为差异
不同Python构建工具的配置逻辑差异很大:
- Poetry:只认
pyproject.toml,不支持setup.py和setup.cfg,所有配置都写在[tool.poetry]区块里,不存在多文件冲突的情况。 - Flit:完全遵循PEP 621规范,仅使用pyproject.toml的
[project]区块定义所有元数据和依赖,不依赖其他配置文件。 - Hatch:以pyproject.toml为核心配置文件,通过
[tool.hatch]区块扩展功能,同样不使用setup.py和setup.cfg,优先级规则围绕pyproject.toml内部的不同区块展开。
内容的提问来源于stack exchange,提问作者quixotrykd

