如何解释 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:
>=6.1,<6.2.0a0
6.1 版*
或>=6.2,<7.0a0
6.2 版*
或>=6.1,<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 包冲突?的主要内容,如果未能解决你的问题,请参考以下文章