添加pyproject.toml后,pkg_resources.get_distribution返回路径异常如何兼容?
解决pyproject.toml导致可编辑安装路径变更的兼容问题
当你给项目添加空的pyproject.toml后,执行可编辑安装(py -3 -m pip install -e <path_to_my_project>)时,pkg_resources.get_distribution('my-project')返回的包路径从项目源码目录变成了Python的site-packages目录,这是因为pip的构建系统回退行为发生了变化。
解决方案
在你的pyproject.toml中添加以下配置,明确指定使用setuptools作为构建系统,就能恢复之前的可编辑安装行为:
[build-system] requires = ["setuptools>=42", "wheel"] build-backend = "setuptools.build_meta"
添加后重新执行可编辑安装命令,pkg_resources.get_distribution就会再次返回项目源码目录的路径,和添加pyproject.toml之前的行为一致。
原因说明
- 没有
pyproject.toml时,pip默认直接执行setup.py,用旧逻辑处理可编辑安装,直接关联到项目源码目录。 - 添加空
pyproject.toml后,pip会启用PEP 517/518的构建流程,此时pip会使用一套默认的构建系统配置,但这套默认配置的可编辑安装逻辑和旧版存在差异,导致包路径指向site-packages。 - 手动指定
[build-system]配置后,pip会使用标准的setuptools构建后端,和原来直接执行setup.py的行为对齐,保证兼容性。
官方文档回退行为翻译
如果
pyproject.toml中没有[build-system]部分,pip会回退到旧的构建行为:直接执行setup.py,不使用PEP 517构建后端。如果
pyproject.toml存在但[build-system]部分缺失,pip会使用以下默认的构建系统配置:[build-system] requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta:__legacy__"这个默认配置使用setuptools的遗留后端,但它的可编辑安装行为和直接执行
setup.py的旧逻辑存在差异,这就是你遇到路径变化的核心原因。
内容的提问来源于stack exchange,提问作者piotrek204
相关产品推荐
相关产品推荐

