Watch at Ease看见世界,读懂生活。

科技 · 实用指南

pip 提示 wheel 有多个 .dist-info?先检查安装包,再清理环境

这个校验错误针对正在打开的 wheel。先定位具体文件、只读列出 ZIP 内容并比较独立下载副本,避免误删已安装元数据或清空全部缓存。

区分一个元数据根、两个根及已安装环境警告的原创图。
原创编辑插画:先检查 wheel ZIP 顶层元数据,再改环境。 Watch at Ease

pip 提示 invalid wheel、multiple .dist-info directories 时,应先检查报错的 wheel,而不是删除 site-packages 下的目录。当前 pip 会从 wheel ZIP 中取出顶层名称,发现多个元数据根目录便拒绝。已安装环境的 invalid distribution 警告属于另一路径,不能混为一谈。

保留失败文件和准确身份

保存完整错误、.whl 文件名、请求的包和版本、Python 可执行文件及 python -m pip --version 输出。记录来自软件源、直链、本地 wheelhouse,还是源码构建。依赖解析中失败的可能是依赖包,而不是命令中直接指定的包。

在当前环境以外保留副本,用 python -m pip hash 加带引号的文件路径记录 SHA-256。共享日志前删除凭据。文件名相同不能证明镜像、缓存和上游返回的字节一致。

只列 ZIP,不解压或执行

运行 python -m zipfile -l 加带引号的 wheel 路径。查看成员名称第一段,记录所有不同的、以 .dist-info 结尾的顶层根目录。同一个元数据目录中有两个文件很正常;两个不同元数据根目录才是此错误要调查的条件。将列表与文件 hash 一同保存。

可选的 python -m zipfile -t 检查 ZIP 完整性。CRC 或文件头检查通过,不代表 pip 接受结构、发布者可信或全部 RECORD hash 已验证。无法读取 ZIP 时应先调查文件本身,不要把不可信归档直接解压到 site-packages 绕过检查。

独立下载一个副本做对照

使用同一解释器和批准的软件源,在空目录运行 python -m pip download --no-deps --only-binary=:all: --no-cache-dir --dest wheel-check,最后加准确且带引号的包名与版本要求。该操作请求兼容 wheel 而不安装;没有兼容二进制时会失败,不要照抄无关旧版本。

比较文件名、hash 和元数据根目录。如果反复得到同一坏包,继续清缓存不能修复上游字节。如果副本不同,则核下载路径、镜像、构建产物与具体文件选择;hash 变化本身不能证明哪一份可信。

修正发布版本选择,再验证实际应用

反复取得的已发布坏包应交维护者或仓库管理员,附版本、文件名、脱敏来源、hash、目录列表与 Python/pip 信息。核项目依赖后,可考虑修正版或明确兼容约束;源码重建另需工具链,不是通用一行修复。

不要从 ZIP 删除一个 .dist-info 就当作原版发布包,元数据与 RECORD 相互关联;也不要因输入包坏了就删已安装元数据。在一次性环境按真实 requirements 测试替代包,运行 python -m pip check 并做应用常规冒烟测试。依赖解析成功并不等于应用兼容。

保留、比较、验证 wheel 的原创工作流程。
原创编辑插画:保留安装包、比较独立下载并测试替代版本。 Watch at Ease