conda-forge:为什么Conda总是要降级NumPy?

时间:2018-09-13 01:28:40

标签: python numpy conda

我正在尝试使用CondaForge的软件包(以确保可用性和兼容性)。但是,Conda似乎更喜欢其他渠道的核心库版本(例如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

有没有一种偏好可以带来更好的行为?

3 个答案:

答案 0 :(得分:5)

之所以会发生这种情况,是因为您有两个通道(conda-forge和默认通道),两个通道都包含NumPy(及其依赖项),但是版本/内部版本号可能不同。

例如,假设您要安装SciPy(取决于NumPy),并且世界的状态是:

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

您的频道顺序中有超过默认值的conda-forge。如果您说conda install scipy,那么Conda将从conda-forge抢夺SciPy(因为它是最高版本号)。在扫描SciPy的依赖项时,它将注意到默认值上有可用的NumPy的较新版本。认为这会有所帮助,即使您已经从conda-forge安装了Conda,Conda也会默认安装NumPy的较新版本。如果有NumPy依赖的软件包,则必须降级以使其正常工作,就这样。

相反,conda install scipy numpyconda config --add pinned_packages conda-forge::numpy表示您跳过了图的那部分的依赖关系查找,然后导致Conda求解器跳到另一个通道。

这是一个相对简单的示例,绝对不能涵盖每天都会出现的所有奇怪的情况。

也就是说,Conda v4.6(尚未发布)将添加“严格的频道优先级”概念。这将确保求解器按先给出的通道顺序查找包,并且如果找不到依赖项,则仅跳至其他通道。

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

答案 1 :(得分:4)

这并不能真正解释为什么会发生,但是解决方法是:

$ conda config --add pinned_packages conda-forge::numpy

答案 2 :(得分:1)

您可以阅读conda-forge文档 http://conda-forge.org/docs/user/tipsandtricks.html#multiple-channels

查看您的频道和优先级 $conda config --describe channel_priority

解决方案是在使用conda-forge软件包时,将.condarc通道添加到conda-forge文件的默认值之上,并使用以下命令激活严格的通道优先级:

$ conda config --set channel_priority strict

.condarc文件的外观如下:

$ cat .condarc channel_priority: strict channels: - conda-forge - defaults

除了通道优先级,我们建议始终将软件包安装在新环境中,而不是anaconda / miniconda的根环境中。使用envs可以更轻松地调试软件包问题并确保root env的稳定性。