Pipenv如何确定待安装包版本?不同版本约束写法有什么区别?
Pipenv 版本指定规则与版本解析逻辑
两种版本写法的核心差异
Pipenv 遵循 PEP 440 版本规范处理版本约束,两种写法的规则如下:
"==4.8":精确匹配约束,仅允许安装4.8这一个确定版本,完全禁止版本升级。"4.8":不带比较操作符的版本号会被默认识别为兼容版本约束,等效于~=4.8,规则是允许安装大于等于4.8、且小于下一个大版本(即<5.0.0)的最新正式版本。你遇到的安装到4.9.2的情况就符合该约束逻辑,因为4.9.2属于4.x版本系列,且高于4.8。
与不指定版本的区别
不指定版本时没有任何范围限制,Pipenv会直接拉取源上该包的最新正式版本,允许跨大版本升级,比如如果numpy发布了2.0.0版本,不指定版本就会直接安装2.0.0;但如果指定了"1.19.3",最高只会安装1.x系列的最新版本,不会升级到2.x及以上的大版本。
Pipenv 确定安装版本的逻辑
Pipenv 解析版本的完整流程如下:
- 优先检查是否存在
Pipfile.lock文件:如果lock文件存在且Pipfile没有发生变更,会直接按照lock文件中记录的精确版本安装包,不会重新解析版本约束。 - 如果没有lock文件,或者
Pipfile已修改,会先读取所有包在Pipfile中声明的版本约束,从配置的PyPI源拉取所有符合约束的版本列表,按照PEP 440规则从高到低排序。 - 遍历版本列表做依赖兼容性校验,确保选中的版本可以满足所有依赖包的版本要求,不存在冲突。
- 最终选中最高版本的符合所有约束的包完成安装,同时生成新的
Pipfile.lock文件锁定所有依赖的精确版本,后续安装默认复用lock文件的版本。
内容的提问来源于stack exchange,提问作者andrea
相关产品推荐
相关产品推荐

