【问题标题】:How to update an existing Conda environment with a .yml file如何使用 .yml 文件更新现有的 Conda 环境
【发布时间】: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(请参阅:stackoverflow.com/questions/54492671/…

标签: python django anaconda conda


【解决方案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 来自:stackoverflow.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 文件包含环境名称
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2020-07-02
  • 1970-01-01
相关资源
最近更新 更多