python - conda 锻造 : Why does Conda inconsistently want to downgrade NumPy?

标签 python numpy conda

我试图更喜欢来自 CondaForge 的包(为了可用性和兼容性)。然而,Conda 似乎更喜欢来自其他 channel 的核心库版本(例如 NumPy)。

例如,当我尝试安装一个新库时,Conda 会提出降级 NumPy,但如果我要求安装相同的库和 NumPy,Conda 不再建议降级。为什么?

$ conda install -c conda-forge beautifulsoup4
The following NEW packages will be INSTALLED:
    beautifulsoup4: 4.6.3-py36_0 conda-forge
The following packages will be UPDATED:
    numpy-base: 1.14.3-py36h0ea5e3f_1 --> 1.15.0-py36h3dfced4_0
The following packages will be DOWNGRADED:
    blas: 1.1-openblas conda-forge --> 1.0-mkl
    numpy: 1.15.1-py36_blas_openblashd3ea46f_1 conda-forge [blas_openblas] --> 1.15.0-py36h1b885b7_0
    scikit-learn: 0.19.2-py36_blas_openblasha84fab4_201 conda-forge [blas_openblas] --> 0.19.1-py36hedc7406_0
    scipy: 1.1.0-py36_blas_openblash7943236_201 conda-forge [blas_openblas] --> 1.1.0-py36hc49cb51_0
Proceed ([y]/n)? n

$ conda install -c conda-forge beautifulsoup4 numpy
The following NEW packages will be INSTALLED:
    beautifulsoup4: 4.6.3-py36_0 conda-forge
Proceed ([y]/n)? y

是否存在可以提供更好行为的偏好?

最佳答案

发生这种情况是因为您有两个 channel (conda-forge 和默认 channel ),它们都包含 NumPy(及其依赖项),但可能具有不同的版本/构建号。

例如,假设您要安装 SciPy(它依赖于 NumPy)并且世界状态是:

  • conda-forge:NumPy v1.14 和 SciPy v1.0
  • 默认值:NumPy v1.15 和 SciPy v1.0

并且您的 channel 顺序中有高于默认值的 conda-forge。如果你说 conda install scipy,那么 Conda 将从 conda-forge 中获取 SciPy(因为它是最高版本号)。在扫描 SciPy 的依赖项时,它会注意到默认情况下有一个更新版本的 NumPy。 Conda 认为它很有帮助,即使您已经从 conda-forge 安装了它,也会从默认情况下安装更新版本的 NumPy。如果有 NumPy 依赖的包,则必须降级才能使其正常工作,就这样吧。

相反,conda install scipy numpyconda config --add pinned_pa​​ckages conda-forge::numpy 您将跳过该部分图表的依赖项查找,然后导致 Conda 求解器跳到不同的 channel 。

这是一个相对简单的示例,绝对没有涵盖每天出现的所有奇怪的边缘情况。

也就是说,Conda v4.6(尚未发布)将添加“严格 channel 优先级”的概念。这将确保求解器首先按照给定的 channel 顺序查找包,并且只有在找不到依赖项时才会跳到不同的 channel 。

这将解决我们一直生活的许多这些猖獗的升级/降级问题。

关于python - conda 锻造 : Why does Conda inconsistently want to downgrade NumPy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52305421/

相关文章:

python - 在 Windows 8.1 中安装 virtualenvwrapper-powershell,导入模块失败

python - 两个不同的缓冲区,相同的 python shell

python - 将 Numpy 数组按列转换为 Pandas DataFrame(作为单行)

python - 如何查看我的 conda 环境的创建日期?

Python 从列表项中获取特定信息并创建新的列表项

java - 如何使用 RESTEasy 在 Google App Engine 中实现 oAuth 2.0?

python - 无需迭代即可遍历数据框的每一行

python - 反向索引数组

python - Conda在64位机器上构建32位包

python - conda 'base' 和 'root' 环境有什么区别?