首页 > 资讯 > 科技 > 正文
2024-02-24 11:11

项目依赖管理——如何避免Python依赖包版本冲突?

| 点击上方蓝色字体- 关注我们

回避方法

查看项目依赖项列表

确认依赖项列表中的所有依赖项都是必需的,并删除任何不必要或过时的依赖项。

删除这些可以显着降低依赖树的复杂性,从而减少冲突的机会。

放宽版本要求

只要有可能,不要将自己锁定在使用特定版本。

指定高优先级包的版本要求,或更改为更宽松的版本范围声明

无需指定版本号或使用版本范围声明,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 的版本