ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

基础.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(请参阅:stackoverflow.com/questions/54492671/…

a
alkamid

尝试使用 conda env update

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

--prune 卸载从 local.yml 中删除的依赖项,正如 @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 来自:stackoverflow.com/a/45525593/3399066 的评论
在最新的 conda 版本中,我认为我们使用“conda activate myenv”而不是“source activate myenv”
有什么办法,我们可以传递一个参数,这个命令将只更新 .yml 文件中的可用库,这将确保当列出的任何库不可用时不会引发错误?
确保 YAML 文件没有 name 参数,否则它会使用此 update 命令创建
B
Blink

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

conda env update -f local.yml --prune

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

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 文件包含环境名称