pip 22.2.2以上版本通过代理安装PyPI包失败问题排查
问题分析与解决方案
一、pip 22.2.2 到 22.3 的关键变更(与元数据获取相关)
- PEP 658元数据支持默认启用:pip 22.3开始默认遵循PEP 658标准,主动请求独立的
.whl.metadata文件来获取包的依赖信息,而旧版本(如22.2.2)通常直接从whl文件本身或PyPI的simple索引页面提取元数据。这意味着新版本pip会额外发起元数据文件的请求,若代理未同步这类文件就会触发404。 - 元数据请求路径的变化:22.3版本pip会直接构造
.whl.metadata的URL进行请求,而你的代理可能只同步了.whl和.tar.gz文件,未处理这种新的文件路径请求。 - 更严格的元数据获取逻辑:新版本pip不再降级处理元数据获取失败的情况,一旦请求不到
.whl.metadata就直接返回404,而旧版本可能会尝试其他方式获取元数据。
二、适配新版本pip的解决方案
1. 同步PEP 658元数据文件到代理
检查你的代理REST API,确保它能同步PyPI上的.whl.metadata文件。这类文件和对应whl文件存放在同一目录下,需要将它们和.whl、.tar.gz一起同步到代理的对应路径,保证代理能正确响应这类文件的请求。
2. 临时强制使用旧版元数据获取逻辑
如果暂时无法修改代理,可以通过参数让pip退回旧的解析逻辑:
pip install --trusted-host url-to-proxy.com --index-url http://url-to-proxy.com:8000/pypi --use-deprecated=legacy-resolver package-name[optional-dependencies]
也可以在pip配置文件(pip.conf或pip.ini)中全局配置:
[global] use-deprecated=legacy-resolver
注意:这个参数在后续pip版本中会被移除,仅作为临时过渡方案。
3. 调整代理的URL路由规则
检查代理的请求处理逻辑,确保当收到/pypi/package-name/package-name-0.0.0-py3-none-any.whl.metadata这类请求时,能正确映射到存储的元数据文件。可能之前的代理只配置了.whl和.tar.gz后缀的文件路由,需要添加.metadata后缀的支持。
4. 更新代理以兼容PEP 658
如果代理是自定义开发的,需要修改同步逻辑,从PyPI拉取并存储PEP 658定义的元数据文件。可以参考PyPI的公开API规范,获取包的元数据文件链接并完成同步。
内容的提问来源于stack exchange,提问作者TheEponymousProgrammer
相关产品推荐
相关产品推荐

