如何解释 conda 包冲突?

Posted

技术标签:

【中文标题】如何解释 conda 包冲突?【英文标题】:How to interpret conda package conflicts? 【发布时间】:2020-06-09 17:48:31 【问题描述】:

我正在尝试创建一个包含 3 个包和特定 python 版本的 conda 环境,并获得以下输出:

$ conda create -n testing_junk -y instrain awscli samtools python=3.8
Collecting package metadata (current_repodata.json): done
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: |
Found conflicts! Looking for incompatible packages.
This can take several minutes.  Press CTRL-C to abort.
failed                                                                                                                                                                             \

UnsatisfiableError: The following specifications were found to be incompatible with each other:

Output in format: Requested package -> Available versions

Package ncurses conflicts for:
python=3.8 -> ncurses[version='>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0']
awscli -> python[version='>=3.8,<3.9.0a0'] -> ncurses[version='5.9.*|5.9|>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0|>=6.0,<7.0a0|6.0.*']
instrain -> python[version='>=3.4'] -> ncurses[version='5.9.*|5.9|>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0|>=6.0,<7.0a0|6.0.*']
python=3.8 -> readline[version='>=7.0,<8.0a0'] -> ncurses[version='5.9.*|>=6.0,<7.0a0|6.0.*']
samtools -> ncurses[version='5.9|5.9.*|>=5.9,<5.10.0a0|>=6.1,<6.2.0a0']

Package python conflicts for:
awscli -> python[version='2.7.*|3.5.*|3.6.*|>=2.7,<2.8.0a0|>=3.6,<3.7.0a0|>=3.7,<3.8.0a0|>=3.8,<3.9.0a0|>=3.5,<3.6.0a0|3.4.*']
python=3.8
instrain -> biopython -> python[version='2.7.*|3.5.*|3.6.*|>=2.7,<2.8.0a0|>=3.6,<3.7.0a0|>=3.8,<3.9.0a0|>=3.7,<3.8.0a0|>=3.5,<3.6.0a0|3.4.*|>3|>=3.5|<3.0.0|>=3.6']
instrain -> python[version='>=3.4']
awscli -> python_abi=3.8[build=*_cp38] -> python[version='3.7.*|3.8.*']

Package ca-certificates conflicts for:
samtools -> openssl[version='>=1.1.1a,<1.1.2a'] -> ca-certificates
python=3.8 -> openssl[version='>=1.1.1g,<1.1.2a'] -> ca-certificates
awscli -> python[version='>=2.7,<2.8.0a0'] -> ca-certificates

Package setuptools conflicts for:
python=3.8 -> pip -> setuptools
instrain -> matplotlib-base -> setuptools[version='>=40.0']

Package libgcc-ng conflicts for:
samtools -> ncurses[version='>=6.1,<6.2.0a0'] -> libgcc-ng[version='>=7.2.0']
samtools -> libgcc-ng[version='>=4.9|>=7.3.0']

Package pypy3.6 conflicts for:
instrain -> numpy -> pypy3.6[version='7.3.0.*|7.3.1.*|>=7.3.1']
awscli -> python[version='>=3.6,<3.7.0a0'] -> pypy3.6[version='7.3.*|7.3.0.*|7.3.1.*']

Package bzip2 conflicts for:
samtools -> bzip2[version='1.0.*|>=1.0.6,<2.0a0|>=1.0.8,<2.0a0']
instrain -> pysam -> bzip2[version='>=1.0.6,<2.0a0|>=1.0.8,<2.0a0']
awscli -> python[version='>=3.7,<3.8.0a0'] -> bzip2[version='>=1.0.6,<2.0a0|>=1.0.8,<2.0a0']

Package zlib conflicts for:
samtools -> zlib[version='1.2.11.*|>=1.2.11,<1.3.0a0|1.2.8.*|1.2.8']
samtools -> curl[version='>=7.59.0,<8.0a0'] -> zlib[version='1.2.*|1.2.11']

Package samtools conflicts for:
samtools
instrain -> pysam -> samtools[version='1.3|1.3.1.*|1.3.1|1.5.*|1.6.*|1.7|1.7.*|1.9.*|>=1.4.1|>=1.4.1,<1.5|>=1.4,<1.5|>=1.3,<1.4|>=1.3']

Package openssl conflicts for:
samtools -> curl[version='>=7.59.0,<8.0a0'] -> openssl[version='1.0.*|>=1.0.2o,<1.0.3a|>=1.0.2m,<1.0.3a']
samtools -> openssl[version='>=1.0.2p,<1.0.3a|>=1.0.2r,<1.0.3a|>=1.1.1a,<1.1.2a']

Package _libgcc_mutex conflicts for:
samtools -> libgcc-ng[version='>=7.3.0'] -> _libgcc_mutex[version='*|0.1',build='main|conda_forge']
python=3.8 -> libgcc-ng[version='>=7.5.0'] -> _libgcc_mutex[version='*|0.1',build='main|conda_forge']The following specifications were found to be incompatible with your CUDA driver:

  - feature:/linux-64::__cuda==10.2=0
  - feature:|@/linux-64::__cuda==10.2=0

Your installed CUDA driver is: 10.2

我了解软件包之间存在一些冲突,但我无法解释此输出以了解问题所在。

例如,在查看第一个冲突块(与ncurses 相关)时,6.1 版不应该满足列出的所有要求吗?

另外,关于包裹setuptools的块,我看不出有什么问题?

任何关于如何解释这些冲突以便我可以尝试解决它们的见解将不胜感激。

【问题讨论】:

如果只指定主要的 Python 版本 (python=3) 会发生什么? 在这种情况下我特别想要python 3.8版 能否创建一个环境文件,让我自己尝试一下?我在 macOS 上,但我认为它仍然值得短暂(显然其他人也可以这样做)。 您是否尝试添加requirements.txt 文件并将no-dependencies = yes 添加到冲突的库中? (doc) 【参考方案1】:

一些实用建议

@Quantum7's answer 对 Conda 的冲突报告给出了很好的字面解释。但是,我想提供一个更实用的观点,即 Conda 的这个“功能”太不具体,在大多数非平凡环境中都没有用处。有时它甚至不包括潜在的冲突。不要浪费时间!

Conda 的冲突报告没有帮助

从表面上看,Conda 试图报告所有可能的冲突来源。也就是说,依赖图中的所有路径集都从显式规范开始并在同一个包中结束。这相当于报告的大部分内容是无害的,坦率地说是分散注意力的。例如zlib“冲突”:

Package zlib conflicts for:
samtools -> zlib[version='1.2.11.*|>=1.2.11,<1.3.0a0|1.2.8.*|1.2.8']
samtools -> curl[version='>=7.59.0,<8.0a0'] -> zlib[version='1.2.*|1.2.11']

由于samtools 直接和间接地依赖于zlib(通过curl 进行调解),这会作为导致约束的两条替代路径出现。问题是最终约束的交集不是空的,所以这里没有不兼容的地方。

此外,在某些情况下,报告的内容都没有冲突(例如,this question 或 this one),这意味着解析输出可能完全是浪费时间。

试试曼巴

相反,如果一个人真正关心的是解决冲突,我发现 Mamba 在速度和精确度方面都更有效。

# install mamba
conda install -n base conda-forge::mamba

# use 'mamba' just like 'conda'
mamba create -n foo instrain awscli samtools python=3.8

不幸的是,这个例子现在可以正常工作了。但是,还有其他问题可以比较 Conda 和 Mamba 不满意报告,例如,this question。

【讨论】:

很好地解释了为什么 conda 在这里过于冗长,并为 mamba 推荐 +1! 这里提示的另一个好处是,如果您事先知道要求是什么,那么在首次创建环境时一次性安装所有内容。【参考方案2】:

包版本规范描述为here,但重要部分是:

, 代表 AND,优先级最高 | 代表 OR 并且具有第二优先级 Alpha 版本(例如“6.2.0a0”)用于上限,因为它们是该版本的第一个可能版本

例如,考虑 ncurses 组的第一行:

python=3.8 -> ncurses[version='>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0']

这表明您请求的 python=3.8 依赖于具有以下版本的 ncurses:

&gt;=6.1,&lt;6.2.0a0 6.1 版* 或&gt;=6.2,&lt;7.0a0 6.2 版* 或&gt;=6.1,&lt;7.0a0(冗余)至少 6.1 但低于 7.0

这些列表很难阅读,因为它们包含许多不必要的约束。但是,也没有看到与您的版本有任何真正的冲突。不相信我自己检查包规范的能力,我找到了直接执行它的 conda 包:

>>> from conda.models import version as cv
>>> cv.VersionSpec(">=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0").match("6.1")
True

对您报告的所有冲突运行此程序,我能够找到满足所有规定的版本要求的版本:https://gist.github.com/sbliven/aab43e1f0bce1f4ac63aaaaa718df0b3

我唯一无法测试的部分是 cuda 部分,但看起来您的显卡确实支持 CUDA 10.2。

当我开始回答这个问题时,我正在准备解释 SAT 求解器(如 conda 中使用的求解器)如何迭代地添加约束,以及这如何导致看似有效的约束被输出为冲突。但是,应该总是有一些冲突,所以我认为你的问题必须在其他地方

由于 samtools 似乎已从 conda-forge 中删除,我自己无法重现该示例,因此我对您看到的确切错误感到困惑。希望了解版本字符串对将来有所帮助。

编辑:当然,samtools 来自 bioconda 而不是 conda-forge!以下命令对我有用:

conda create -n testing_junk -c bioconda -y instrain awscli samtools python=3.8

解决了这些软件包版本(可能在您发布问题后已修复):

The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    asteval-0.9.16             |     pyh5ca1d4c_0          18 KB  conda-forge
    awscli-1.18.221            |   py38h50d1736_0         1.8 MB  conda-forge
    biopython-1.74             |   py38h0b31af3_0         2.5 MB  conda-forge
    blas-2.14                  |         openblas          10 KB  conda-forge
    boost-1.70.0               |   py38hbf1eeb5_1         347 KB  conda-forge
    boost-cpp-1.70.0           |       hef959ae_3        18.9 MB  conda-forge
    botocore-1.19.61           |     pyhd8ed1ab_0         4.5 MB  conda-forge
    brotlipy-0.7.0             |py38h5406a74_1001         357 KB  conda-forge
    c-ares-1.11.0              |                0          73 KB  bioconda
    capnproto-0.6.1            |       h0ceac7d_2         2.4 MB  conda-forge
    cffi-1.14.4                |   py38h979bc6b_1         219 KB  conda-forge
    colorama-0.4.3             |             py_0          17 KB  conda-forge
    cryptography-3.3.1         |   py38h6b4ec92_1         614 KB  conda-forge
    docutils-0.15.2            |   py38h50d1736_1         739 KB  conda-forge
    drep-3.0.0                 |             py_2          59 KB  bioconda
    fastani-1.32               |       he69ab0f_0         151 KB  bioconda
    future-0.18.2              |   py38h50d1736_3         715 KB  conda-forge
    hdf5-1.10.6                |nompi_h34ad4e8_1111         3.0 MB  conda-forge
    htslib-1.11                |       h422799e_1         1.5 MB  bioconda
    idna-3.1                   |     pyhd3deb0d_0          52 KB  conda-forge
    instrain-1.4.0             |             py_0         380 KB  bioconda
    jmespath-0.10.0            |     pyh9f0ad1d_0          21 KB  conda-forge
    joblib-1.0.0               |     pyhd8ed1ab_0         206 KB  conda-forge
    kiwisolver-1.3.1           |   py38hd9c93a9_1          57 KB  conda-forge
    libblas-3.8.0              |      14_openblas          10 KB  conda-forge
    libcblas-3.8.0             |      14_openblas          10 KB  conda-forge
    libdeflate-1.6             |       h0b31af3_0          61 KB  conda-forge
    liblapack-3.8.0            |      14_openblas          10 KB  conda-forge
    liblapacke-3.8.0           |      14_openblas          10 KB  conda-forge
    libnghttp2-1.41.0          |       h8a08a2b_1         736 KB  conda-forge
    libopenblas-0.3.7          |       h3d69b6c_4         8.2 MB  conda-forge
    llvm-openmp-8.0.1          |       h770b8ee_0         253 KB  conda-forge
    llvmlite-0.34.0            |   py38h3707e27_2         247 KB  conda-forge
    lmfit-1.0.1                |             py_1          69 KB  conda-forge
    mash-2.2.2                 |       h194473e_2         449 KB  bioconda
    matplotlib-base-3.3.4      |   py38hb24f337_0         6.8 MB  conda-forge
    mummer4-4.0.0rc1           |  pl526h4a8c4bd_0         699 KB  bioconda
    numba-0.51.2               |   py38h6be0db6_0         3.5 MB  conda-forge
    openmp-8.0.1               |                0           8 KB  conda-forge
    pandas-1.2.1               |   py38he9f00de_0        10.6 MB  conda-forge
    pillow-8.1.0               |   py38hc1d52f7_1         646 KB  conda-forge
    pluggy-0.13.1              |   py38h50d1736_4          29 KB  conda-forge
    prodigal-2.6.3             |       h01d97ff_2         397 KB  bioconda
    psutil-5.8.0               |   py38h5406a74_1         350 KB  conda-forge
    pyasn1-0.4.8               |             py_0          53 KB  conda-forge
    pysam-0.16.0.1             |   py38hb3e8b06_1         2.1 MB  bioconda
    pysocks-1.7.1              |   py38h50d1736_3          27 KB  conda-forge
    pytest-6.2.2               |   py38h50d1736_0         432 KB  conda-forge
    pyyaml-5.3.1               |   py38h5406a74_2         173 KB  conda-forge
    rsa-4.4.1                  |     pyh9f0ad1d_0          27 KB  conda-forge
    s3transfer-0.3.4           |     pyhd8ed1ab_0          51 KB  conda-forge
    samtools-1.11              |       h725deca_0         381 KB  bioconda
    scikit-learn-0.22.1        |   py38hebd9d1a_0         4.7 MB
    scipy-1.5.3                |   py38h352ea5d_0        19.1 MB  conda-forge
    seaborn-0.11.1             |       hd8ed1ab_1           4 KB  conda-forge
    seaborn-base-0.11.1        |     pyhd8ed1ab_1         217 KB  conda-forge
    statsmodels-0.12.1         |   py38hc7193ba_2        10.5 MB  conda-forge
    tornado-6.1                |   py38h5406a74_1         643 KB  conda-forge
    uncertainties-3.1.5        |     pyhd8ed1ab_0          75 KB  conda-forge
    ------------------------------------------------------------
                                           Total:       110.1 MB

【讨论】:

【参考方案3】:

有时包会发生冲突,因为是从不同的频道下载的。在终端试试这个:

conda config --add channels conda-forge # add conda-forge channel
conda config --set channel_priority strict # set priority of channel

然后试试:

conda create -n testing_junk -c conda-forge python=3.8 -y instrain awscli samtools

希望对你有用

【讨论】:

感谢您的建议,但运行此命令会导致类似的关于版本冲突的令人困惑的消息 这没有回答关于理解冲突输出的原始问题

以上是关于如何解释 conda 包冲突?的主要内容,如果未能解决你的问题,请参考以下文章

Anaconda 中的依赖项和包冲突?

如何解决包冲突问题

完美解决Python与anaconda之间的冲突问题

如何删除maven中冲突的jar包

如何解决maven 与 tomcat jar包冲突

如何解决包冲突问题