opencv - 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
,它被完全删除了)
解决方案
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 使用两阶段依赖解决策略。这两个阶段是
- 使用隐式
--freeze-installed|--no-update-deps
标志求解。这将尝试查找与已安装包没有冲突的最新版本的请求包。也就是说,无论版本如何,它都认为软件包的任何安装都是令人满意的解决方案。如果它有效,那么它就完成了。否则,继续... - 一个不受限制的解决方案(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
.
推荐阅读
- android - 像 instagram 一样的底部导航视图
- python - Python Terresact 没有给出真实格式的数字
- python - Python 的单元测试无法为 Discord 机器人测试传递参数“缺少 1 个必需的位置参数:'ctx'”?
- html - css悬停以更改具有同一类的多个不相关元素
- python - 需要帮助解决字符串和列表的代码
- python - 创建表示阶段时间线的图表
- r - grid.arrange 显示多个 facet_wrap 图 - 如何使面板宽度一致?
- arrays - 在 C 中找出一种创建字符串并用它们填充数组的方法
- flutter - Flutter iOS BITCODE 问题
- javascript - Next.js:如何从当前子页面转到父页面?