启用-W error安装tar.gz包触发pkg_resources弃用错误,如何在setup.py中补丁Environment?
解决方案:在setup.py中猴子补丁pip的Environment类
核心思路
直接修改pip内部Environment类的_iter_distributions方法,移除调用finder.find_eggs()的逻辑——这部分正是触发pkg_resources弃用警告的根源。由于pip在运行setup.py时已加载相关模块,我们可以在setup.py最开头执行补丁,避免警告被转为错误。
具体实现代码
将以下代码放在setup.py的最顶部(在导入setuptools或其他模块之前):
import sys from importlib.util import find_spec # 仅在目标环境下执行补丁(匹配测试环境的Python 3.11+、pip 23.x) if sys.version_info >= (3, 11) and find_spec("pip") is not None: try: from pip._internal.metadata.importlib._envs import Environment def patched_iter_distributions(self): # 保留原逻辑的核心部分,移除触发问题的find_eggs调用 for finder in self._finders: yield from finder.find_installed_distributions() # 注释掉原代码中yield from finder.find_eggs()这一行 # 替换类的方法 Environment._iter_distributions = patched_iter_distributions except (ImportError, AttributeError): # 若pip版本结构变化,跳过补丁,避免安装失败 pass # 后续正常的setup.py配置代码 from setuptools import setup, find_packages setup( name="nspace.pkga", version="0.1.0", # 你的其他包配置项... )
关键细节说明
- 补丁时机:必须放在setup.py最开头,确保在pip执行依赖检测等逻辑前完成方法替换。
- 兼容性防护:通过Python版本、pip模块存在性判断,加上异常捕获,避免在不匹配环境或pip版本结构变化时导致安装失败。
- 最小修改:仅移除触发警告的
find_eggs()调用,保留原方法的核心功能,不影响正常的依赖检测流程。
验证效果
执行原安装命令:
python -W error -m pip install /some/path/nspace.pkga-0.1.0.tar.gz
此时不会再触发pkg_resources的弃用警告转错误,安装可正常完成。
内容的提问来源于stack exchange,提问作者Anthon
相关产品推荐
相关产品推荐

