You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:17:42