如何使用 .yml 文件更新现有的 Conda 环境

Posted

技术标签:

【中文标题】如何使用 .yml 文件更新现有的 Conda 环境【英文标题】:How to update an existing Conda environment with a .yml file 【发布时间】:2017-07-10 05:18:17 【问题描述】:

如何使用另一个 .yml 文件更新预先存在的 conda 环境。这在处理具有多个需求文件的项目时非常有用,例如 base.yml, local.yml, production.yml 等。

例如,下面是一个base.yml 文件,其中包含 conda-forge、conda 和 pip 包:

base.yml

name: myenv
channels:
  - conda-forge
dependencies:
  - django=1.10.5
  - pip:
    - django-crispy-forms==1.6.1

实际环境是通过以下方式创建的: conda env create -f base.yml.

稍后,需要将额外的包添加到base.yml。另一个文件,比如local.yml,需要导入这些更新。

之前的尝试包括:

使用导入定义创建local.yml 文件:

channels:

dependencies:
  - pip:
    - boto3==1.4.4
imports:
  - requirements/base. 

然后运行命令: conda install -f local.yml

这不起作用。有什么想法吗?

【问题讨论】:

是否可以更新当前激活的环境??我刚试过这个,但更新到了 yml 文件中命名的环境。 这可能对从头开始有用:conda env create -f ~/CoqGym/coq_gym.yml(请参阅:***.com/questions/54492671/…) 【参考方案1】:

尝试使用conda env update:

conda activate myenv
conda env update --file local.yml --prune

--prune 卸载从@​​987654327@ 中删除的依赖项,正如@Blink 在this answer 中指出的那样。

或者不需要激活环境(感谢@NumesSanguis):

conda env update --name myenv --file local.yml --prune

请参阅 Conda 用户指南中的 Updating an environment。

【讨论】:

-ffile.yml 之间不需要等号。删除等号将使制表符完成在.yml 文件名上工作。 添加--name env_name 以忽略local.yml 中的任何name: foo 标签。还可以防止需要先激活 myenv。完整命令:conda env update --name env_name --file local.yml 来自:***.com/a/45525593/3399066 的评论 在最新的 conda 版本中,我认为我们使用“conda activate myenv”而不是“source activate myenv” 有什么办法,我们可以传递一个参数,这个命令将只更新 .yml 文件中的可用库,这将确保当列出的任何库不可用时不会引发错误? 确保 YAML 文件没有 name 参数,否则它会使用此 update 命令创建【参考方案2】:

建议的答案部分正确。您还需要添加 --prune 选项来卸载从 environment.yml 中删除的软件包。 正确的命令:

conda env update -f local.yml --prune

【讨论】:

即使是 --prune 标志也不足以删除 pip 安装的依赖项... 是的。我认为它将删除 conda 依赖项,但不会删除 pip 下列出的依赖项 有什么办法,我们可以传递一个参数,这个命令将只更新 .yml 文件中的可用库,这将确保当列出的任何库不可用时不会引发错误? 如果我的requirements.yml文件顶部有name:会有问题吗?【参考方案3】:

alkamid 的答案是正确的,但我发现如果环境已经处于活动状态,Conda 无法安装新的依赖项。首先停用环境可以解决此问题:

source deactivate;
conda env update -f whatever.yml;
source activate my_environment_name; # Must be AFTER the conda env update line!

【讨论】:

如果不是当前活动的环境,conda 如何知道要更新哪个环境? @ThomasFauskanger 您可以使用-n <environment name> 明确指定它,但默认情况下它似乎适用于预期环境(可能是最近活动的,或者只是默认环境选择) @ThomasFauskanger 如果环境的名称已被 conda 导出,则在 YAML 文件中指定。 我认为这个问题的老观点是将不同的环境更新为 yaml 文件中指定的环境。 @ThomasFauskanger yaml 文件包含环境名称

以上是关于如何使用 .yml 文件更新现有的 Conda 环境的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose.yml修改之后,怎样更新现有的Container

如何使用新生成的 .pot 文件更新现有的 .po 文件?

如何使用 pip 安装来自 github 的 egg 文件,而不是在当前目录中,而是在 conda env 目录中?

使用 Shell Executor 在 GitLab Config yml 文件中为 CI-CD 激活 Conda 环境

conda常用命令之–虚拟环境管理(教你如何创建激活重命名删除虚拟环境)

Serverless.yml:在另一个中引用现有的环境变量