首页 > 解决方案 > Conda 不安装最新的可用版本

问题描述

在带有 Python 3.7.3 的 Conda 环境中的 Ubuntu 上,当我运行时

conda install -c conda-forge opencv 

即使https://anaconda.org/conda-forge/opencv指示版本 4.11 ,我也得到 OpenCV 3.4.2(import cv2然后检查)。为什么?cv2._version__

请注意,我之前没有安装 OpenCV(我跑了conda uninstall opencv,它被完全删除了)

标签: opencvconda

解决方案


tl;dr您可能以前安装了需要更新的依赖项。如果你需要一个特定的版本,比如 4.1,然后把它表达给 Conda:

conda install -c conda-forge opencv=4.1

解释

Conda 如何解释规范

命令的字面翻译

conda install -c conda-forge opencv

会像

在包含conda-forge通道的情况下,确保opencv在当前活动的环境中安装了某些版本的软件包。

这里的逻辑意味着它可以安装的任何版本都是有效的解决方案。它也没有告诉它它必须来自 Conda Forge,只是应该包含该频道。1

两阶段解决策略

从 v4.7 开始,Conda 使用两阶段依赖解决策略。这两个阶段是

  1. 使用隐式--freeze-installed|--no-update-deps标志求解。这将尝试查找与已安装包没有冲突的最新版本的请求包。也就是说,无论版本如何,它都认为软件包的任何安装都是令人满意的解决方案。如果它有效,那么它就完成了。否则,继续...
  2. 一个不受限制的解决方案(Conda < 4.7 中的默认解决方案)。这释放了要更新的依赖项,并且通常会导致安装最新版本,除非这些软件包以前有明确的规范。2

此策略旨在通过避免更改环境中的任何内容来提供更快的解决和安装体验。它还通过避免不必要的版本更改来帮助保持环境稳定。

问题中的具体失败

OP的情况发生了什么?OpenCV 的依赖项要求之一在 v4.1.1 中可能比已安装的更新,但该依赖项的版本与安装 OpenCV 3.4.2 兼容。因此,唯一会改变的是添加opencv加上缺少的依赖项。从技术上讲,这是一个有效的解决方案,因为只要求安装某个版本 opencv


获取最新版本

选项:指定版本

如果你知道你想要一个特定的版本,那么你可以随时指定它

conda install -c conda-forge opencv=4.1.1

并且由于 Conda 无法在不更新环境中的某些内容的情况下安装它,因此第一轮求解将失败,而完整的求解将为您获取它。

选项:跳过冻结

当然,您可能并不总是知道最新版本号是什么,并且不想每次都在 Anaconda Cloud 上查找。幸运的是,有一个--update-deps标志基本上跳过了第一个求解阶段并直接进入完全求解。这将为您的系统安装最新版本,并更新任何依赖项。

conda install --update-deps -c conda-forge opencv

重要提示:--update-deps标志具有将依赖项转换为显式规范的副作用。虽然这是一个内部环境状态(通过 管理<env>/conda-meta/history),但它确实会产生一些行为后果(错误!):

  • conda env export --from-history命令的结果随后将包括所有包,而不仅仅是用户过去明确请求的包
  • conda remove将无法修剪依赖项;例如,如果scipy已安装,它将拉入numpy;如果只scipy依赖numpy并被scipy删除,通常numpy也会被删除。--update-deps使用标志后这将不起作用。

[1]:此处的行为取决于channel_priority配置选项。通过该strict设置,conda-forge将优先于其他渠道;通过flexible设置,它会被简单地添加到列表中,并选择来自任何频道的最新兼容版本。

[2]:可以使用conda env export --from-history.


推荐阅读