【问题标题】:Conda Conflicts Not Resolving After Installing Packages安装软件包后 Conda 冲突未解决
【发布时间】:2023-06-18 02:08:01
【问题描述】:

我正在尝试安装一个名为 Symtopo 的软件包,它是来自所有者 materiae 的 Conda 软件包。该包具有依赖关系,当我在其上运行conda install 时,会导致此错误(我当前的 Conda 环境正在运行 Python 3.7.4):

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

Package openssl conflicts for:
python=3.7.4 -> openssl[version='>=1.1.1c,<1.1.2a']
Package phonopy conflicts for:
symtopo -> phonopy=2.1.3
Package ncurses conflicts for:
python=3.7.4 -> ncurses[version='>=6.1,<7.0a0']
Package sqlite conflicts for:
python=3.7.4 -> sqlite[version='>=3.29.0,<4.0a0']
Package libcxx conflicts for:
python=3.7.4 -> libcxx[version='>=4.0.1']
Package h5py conflicts for:
symtopo -> h5py=2.9.0
Package pymatgen conflicts for:
symtopo -> pymatgen=2019.4.11
Package libffi conflicts for:
python=3.7.4 -> libffi[version='>=3.2.1,<4.0a0']
Package xz conflicts for:
python=3.7.4 -> xz[version='>=5.2.4,<6.0a0']
Package readline conflicts for:
python=3.7.4 -> readline[version='>=7.0,<8.0a0']
Package pip conflicts for:
python=3.7.4 -> pip
Package tk conflicts for:
python=3.7.4 -> tk[version='>=8.6.8,<8.7.0a0']
Package abipy conflicts for:
symtopo -> abipy=0.6.0
Package zlib conflicts for:
python=3.7.4 -> zlib[version='>=1.2.11,<1.3.0a0']

我最初在一个完全干净的 Conda 环境中工作。创建后,我运行conda list 并且没有安装任何软件包。收到这些错误后,我拿了一些包并将它们放入需求文件并在它们上运行安装。我的conda list 现在结果:

ca-certificates           2019.9.11            hecc5488_0    conda-forge
certifi                   2019.9.11                py37_0    conda-forge
libcxx                    4.0.1                hcfea43d_1    conda-forge
libcxxabi                 4.0.1                hcfea43d_1
libedit                   3.1.20181209         hb402a30_0
libffi                    3.2.1             h6de7cb9_1006    conda-forge
ncurses                   6.1                  h0a44026_1
openssl                   1.1.1c               h01d97ff_0    conda-forge
pip                       19.3.1                   py37_0
python                    3.7.4                h359304d_1
readline                  7.0               hcfe32e1_1001    conda-forge
setuptools                41.6.0                   py37_0
sqlite                    3.29.0               ha441bb4_0
tk                        8.6.8                ha441bb4_0
wheel                     0.33.6                   py37_0
xz                        5.2.4             h1de35cc_1001    conda-forge
zlib                      1.2.11            h0b31af3_1006    conda-forge

然后我再次尝试安装该软件包,并遇到了与之前相同的错误。我不明白这是怎么可能的,因为您可以看到我现在已经安装了 zlibtkxz。我不确定如何正确解决这些冲突,因为在安装了适当的包/版本后,它似乎没有帮助。

感谢您的帮助!

【问题讨论】:

    标签: python anaconda conda


    【解决方案1】:

    怀疑原因

    从您的构建 ID 来看,您使用的是 osx-64 平台。对于所有 osx-64 构建,SymTopo 的依赖要求看起来很奇怪,具体来说,它们需要 pymatgen=2019.4.11.*,而从搜索 Anaconda Cloud 中却不存在。然而,在 linux-64 构建中,这个要求是 pymatgen&gt;=2019.4.11,所以我认为作者这样做不正确,因此您无法解决连贯的包配置。


    可能的解决方法

    除了联系作者并要求他们发布一些工作版本之外,我认为您有两种可能的行动方案:

    1. 强制安装
    2. 使用 PyPI 构建

    无论哪种方式,假设生成的 env 将是脆弱的,因此请尽量避免在其中进行任何不必要的安装。

    强制安装

    如果我们假设pymatgen=2019.4.11.* 真的应该是pymatgen&gt;=2019.4.11 那么你可以只安装所有的 prereqs(参见下一节中的 YAML),然后使用

    conda install -n my_env --no-deps materiae::symtopo
    

    这可能值得一试,但 Conda 帮助 (conda install -h) 毫不含糊地警告说,这样做并不能保证。

    使用 PyPI 构建

    解决此问题的另一种方法是enable Pip interoperability in Conda,尽管这是一个相对实验性的功能。策略是:

    1. 创建一个环境,将所有先决条件安装为 Conda 和 PyPI 包的组合。
    2. 启用 Pip 互操作性仅针对此环境
    3. 从 Conda 安装 SymTopo。

    我对此进行了测试,并让它与以下 YAML 作为初始 env 定义一起使用:

    symtopo-prereqs.yaml

    name: symtopo_env
    channels:
     - conda-forge
     - defaults
    dependencies:
     - python=3.7
     - h5py=2.9.0
     - phonopy=2.1.3
     - pip
     - pip:
       - abipy==0.6.0
       - pymatgen==2019.4.11
    

    那么命令是:

    conda env create -f symtopo-prereqs.yaml
    conda activate symtopo_env
    conda config --env --set pip_interop_enabled true
    conda install materiae::symtopo
    

    同样,我认为这个环境非常脆弱 (for the reasons given here) 并避免对其进行更多安装。

    请注意,我发现使用推荐频道中的abipy 会导致冲突,因此我选择仅使用 PyPI 版本。不幸的是,这会导致很多包来自 PyPI,但它确实安装了所有东西。

    【讨论】:

    • 这太好了,非常感谢。我得出的结论是原作者做错了一些事情,并且由于没有公共 GitHub,因此无处发布。看起来 PyPI 是迄今为止最可靠的方法,但也会将其发送给作者,以希望在未来的更新中进行清理。非常感谢您的帮助,现在就试试吧!
    • 安装效果很好(应用程序实际上有多稳定还有待观察,但这会让我启动并运行)。感谢您的帮助!
    • @MillerMedia 很高兴为您提供帮助!我的另一个想法是,也许那些旧版本的pymatgen 是从 Anaconda Cloud 中提取的,所以这可能不完全是作者的错。
    • 有道理。我实际上会与他们联系,看看我是否可以帮助他们在技术方面保持这一点,所以这是一个非常有帮助的起点(我也会将他们引导至您的答案以获取上下文)。谢谢!