更新pip与setuptools==66.0后触发packaging.version.InvalidVersion错误
解决pip因distro-info版本号不兼容导致的崩溃问题
问题描述
更新pip并安装setuptools==66.0后,pip完全无法执行任何操作,抛出以下错误:
Traceback (most recent call last): File "/usr/bin/pip", line 6, in <module> from pkg_resources import load_entry_point File "/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py", line 3249, in <module> def _initialize_master_working_set(): File "/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py", line 3223, in _call_aside f(*args, **kwargs) File "/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py", line 3261, in _initialize_master_working_set working_set = WorkingSet._build_master() File "/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py", line 619, in _build_master return cls._build_from_requirements(__requires__) File "/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py", line 632, in _build_from_requirements dists = ws.resolve(reqs, Environment()) File "/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py", line 1044, in __init__ self.scan(search_path) File "/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py", line 1077, in scan self.add(dist) File "/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py", line 1096, in add dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) File "/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py", line 2631, in hashcmp self.parsed_version, File "/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py", line 2685, in parsed_version raise packaging.version.InvalidVersion(f"{str(ex)} {info}") from None pkg_resources.extern.packaging.version.InvalidVersion: Invalid version: '0.23ubuntu1' (package: distro-info)
核心原因是setuptools==66.0启用了严格的PEP 440版本号校验,而系统自带的distro-info包使用了Ubuntu定制的版本号格式(0.23ubuntu1),不符合校验规则,导致pkg_resources初始化失败。
解决方案
方案1:重新安装系统版distro-info(推荐)
通过系统包管理器重新安装兼容的distro-info包,确保版本号被正确处理:
sudo apt install --reinstall python3-distro-info
方案2:降级setuptools到兼容版本
setuptools==65.7.0及更早版本对非标准版本号兼容性更好,直接用python内置工具降级:
sudo python3 -m easy_install setuptools==65.7.0
方案3:临时修改版本校验逻辑(应急用)
如果前两个方案无法执行,可临时修改pkg_resources的代码跳过严格校验:
- 打开
/usr/local/lib/python3.8/dist-packages/pkg_resources/__init__.py - 找到
parsed_version属性定义的位置(约2680-2685行),替换为以下代码:
@property def parsed_version(self): if not hasattr(self, '_parsed_version'): try: self._parsed_version = packaging.version.Version(self.version) except packaging.version.InvalidVersion as ex: # 兼容非PEP440标准的版本号 self._parsed_version = packaging.version.LegacyVersion(self.version) return self._parsed_version
- 保存文件后,pip即可临时恢复使用,后续建议尽快用方案1或2彻底修复。
内容的提问来源于stack exchange,提问作者Artik gnom
相关产品推荐
相关产品推荐

