| 点击上方蓝色字体- 关注我们
回避方法
查看项目依赖项列表
确认依赖项列表中的所有依赖项都是必需的,并删除任何不必要或过时的依赖项。
删除这些可以显着降低依赖树的复杂性,从而减少冲突的机会。
放宽版本要求
只要有可能,不要将自己锁定在使用特定版本。
仅指定高优先级包的版本要求,或更改为更宽松的版本范围声明
无需指定版本号或使用版本范围声明,pip 将自动查找兼容版本来解决冲突。
pip 如何自动执行此操作?
日常我们在安装第三方包的时候,难免会遇到包依赖的版本冲突。
有时您会看到 pip 在完成安装之前下载了同一软件包的多个版本。
有时 pip 可能需要很长时间才能确定要安装什么。
有时会弹出错误信息,要求我们修改环境中已安装包的版本。
当我们调用pip xxx(某个包)时,pip需要计算这个包的所有依赖包以及应该安装哪个版本的依赖包。
依赖解析
pip 确定要安装哪个版本的依赖包的过程称为依赖解析 ( )。
依赖解析过程中会发生什么,最终是如何确定的?
pip首先下载软件包的分发文件,并根据这些文件获取软件包的依赖包列表。
对需要安装的依赖项的版本进行假设,然后检查这些假设是否正确。
当 pip 发现它之前所做的假设不正确时,它会返回(回溯)并尝试使用另一个版本进行安装。
如果假设成功,pip将继续处理下一个依赖包(重复该过程)。
回溯
pip的回溯过程中,在没有进一步详细的版本规范的情况下,会先从最新版本开始尝试,直到确定当前版本与安装兼容且不存在版本冲突。
在极端情况下,回溯操作的时间复杂度将是穷举算法的时间复杂度。
因此,如果pip安装过程进入回溯阶段,可能需要很长时间才能完成。
在包有多个版本的情况下,确定哪个版本可用可能会花费大量时间。
时间长度还取决于包的大小、pip 必须尝试的版本数量以及各种其他因素。
减少回溯的方法
通过 --no-deps 禁用解析依赖项
直接中断当前操作(ctl+c)
向 pip 包添加版本约束(“cup >= 3.13”)以减少尝试的版本数量
创建一个锁定文件,声明该包的每个依赖项的确切包名称和版本号。
版本限制
操作员
描述
例子
大于指定版本的任何版本。
>3.1
任何高于 3.1 的版本