多pip索引存在同版本包时,pip如何选择安装源?
当多个PyPI索引存在同版本同包名时pip的选择逻辑
核心结论
当不同索引中存在名称和版本完全一致的包时,pip没有公开承诺的固定选择规则,官方默认假设这类包是完全可互换的,实际选择行为受内部实现细节和缓存影响。
具体行为细节
- 索引查询顺序≠选择优先级:pip会先查询
index-url配置的仓库,再查询extra-index-url的仓库,但这只是查询顺序,并非选择优先级。pip会收集所有符合条件的候选包,之后的选择并不严格遵循索引的查询顺序。 - 内部排序的隐性规则:当所有候选包版本一致时,pip内部会对候选包进行排序,排序依据可能包括:
- 包的上传时间(从仓库元数据获取)
- 包文件的哈希值(按字母顺序排序)
- 仓库URL的字母顺序
这些属于内部实现细节,不同pip版本可能有变化,官方不会将其作为公开规则承诺。
- 缓存会干扰选择结果:如果本地缓存中已有该版本的包,pip会直接使用缓存文件,不会重新查询所有索引,这会让你误以为pip固定选择了某个仓库的包,但这是缓存机制导致的,并非主动选择规则。
官方立场与破局方法
官方文档明确说明“搜索位置无优先级”,且默认认为同版本同包名的包应该是完全可互换的——也就是说,官方不推荐出现这种场景,若出现,pip不保证选择哪一个。
如果需要强制选择特定仓库的包,可以用以下方法:
- 临时指定单个索引安装:
pip install --index-url url.to.registry_1/pypi/simple package-b==0.2.0 - 直接指定包的完整下载URL:
pip install https://url.to.registry_1/pypi/simple/package-b/package-b-0.2.0.tar.gz - 临时禁用额外索引:
pip install --no-extra-index-url package-b==0.2.0
内容的提问来源于stack exchange,提问作者sab0
相关产品推荐
相关产品推荐

