Conda 安装冲突要求

Conda install conflicting requirements

我正在尝试使用 Conda 从 Pip 需求文件创建环境。文件内容为

requirements.txt

numpy==1.18.2
torch==1.4.0
torchvision==0.5.0
scikit-learn==0.22.2.post1
Pillow==8.3.2
pydicom==1.4.2
pandas==1.0.3

运行命令

conda create -n $name --file requirements.txt

由于缺少频道而出现 PackageNotFound 错误。

我该如何修改?

可能的问题

有一些潜在的问题。

康达pytorch

首先,并非 Conda 中的所有包都使用与其他存储库中相同的名称。部分原因是 Conda 的性质是一个通用包存储库,而不是 language-specific 一个。特别是,torch 模块是通过 Conda pytorch 包提供的。

所以这必须改变。

NumPy 版本不可用

该特定版本的 NumPy 似乎在 defaultsconda-forge 频道中不可用。

$ mamba search numpy=1.18.2
No match found for: numpy=1.18.2. Search: *numpy*=1.18.2

PackagesNotFoundError: The following packages are not available from current channels:

  - numpy=1.18.2

Current channels:

  - https://conda.anaconda.org/conda-forge/osx-64
  - https://conda.anaconda.org/conda-forge/noarch
  - https://conda.anaconda.org/bioconda/osx-64
  - https://conda.anaconda.org/bioconda/noarch
  - https://repo.anaconda.com/pkgs/main/osx-64
  - https://repo.anaconda.com/pkgs/main/noarch
  - https://repo.anaconda.com/pkgs/r/osx-64
  - https://repo.anaconda.com/pkgs/r/noarch

为什么会发生这种情况? 对于大多数 Python 包,Conda 在 PyPI 存储库的下游工作。当新版本发布时,Conda Forge 机器人(例如)将 auto-generate 向相应的原料发出拉取请求。有时这些并不能“正常工作”,需要进行一些故障排除才能构建。有时,使构建工作的过程不会在新版本发布之前完成。这会导致更新的拉取请求取代前一个拉取请求,并可能导致旧的拉取请求被放弃。这导致 Conda Forge 对 PyPI 的覆盖范围存在差距,并且是 exactly what happened here.

如果您可以接受不同的版本,conda-forge确实提供了 v1.18.1(下)和 v1.18.4(上)。

否则,如果您需要包版本的精确复制,那么您将不得不从 PyPI 获取它。我会在最后展示这个。

频道问题

缺少频道

OP不表示通道配置。例如,torchvision==0.5.0 包只能通过 pytorch 渠道获得。

屏蔽频道

这里的另一个问题可能是 channel_priority: strict 设置的使用。如果使用此设置,则具有所需版本的频道可能 先验 被 SAT 求解器排除只是因为包(但不是正确的版本)在更高版本中可用优先通道。这些天 channel_priority: flexible 是默认值,可以设置为:

conda config --set channel_priority flexible

解决方案

精确复制(仅限 PyPI)

给出软件包名称和版本,这些软件包可能源自 PyPI。如果您需要精确复制原始环境——比如说,为了重现科学结果——那么我建议从 PyPI 采购所有东西。最好的方法是使用 Conda 获取 Python 和 Pip,然后让 Pip 安装 requirements.txt.

从软件包版本来看,我们说的是 Python 3.7 或 3.8。您可能只需要 python=3.8 就可以了,但是 [精确估计 from release dates 会是 python=3.8.2。所以,试试像这样的东西:

environment.yaml

name: my_env
channels:
  - conda-forge
dependencies:
  - python=3.8.2
  - pip
  - pip:
    - -r requirements.txt

然后用

创建环境
conda env create -n $name -f environment.yaml

确保 requirements.txt 位于包含 YAML 的文件夹中。

如果稍后将包添加到此环境中,我建议只使用 pip install。否则,Conda may have issues.

Conda-only环境

假设可以替换 numpy=1.18.2,Conda-only 环境可能类似于:

environment.yaml

name: my_env
channels:
  - pytorch
  - conda-forge
dependencies:
  - python=3.8
  - numpy=1.18.1  # alternatively, 1.18.4
  - pytorch=1.4.0
  - torchvision=0.5.0
  - scikit-learn=0.22.2.post1
  - pillow=8.3.2
  - pydicom=1.4.2
  - pandas=1.0.3

再次创建:

conda env create -n $name -f environment.yaml

请注意,在 YAML 中仅使用一个 =。如果您计划以 ad hoc 方式(例如 conda install)通过 Conda 安装额外的软件包,这将是最好的方法。

混合Conda-Pip环境

您也可以尝试与上一个基本相似的混合环境,但 Pip 专门提供 numpy==1.18.2。我不推荐这样做,因为其他依赖项肯定首先从 Conda 引入 NumPy,然后 Pip 会破坏它以提供确切的版本。