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

til*_*oom 87 python django anaconda conda

这是在这里被问到但从未回答.

如何使用另一个.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
Run Code Online (Sandbox Code Playgroud)

创建实际环境: conda env create -f base.yml.

稍后,需要添加其他包base.yml.例如local.yml,另一个文件需要导入这些更新.

以前尝试完成此任务包括:

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

channels:

dependencies:
  - pip:
    - boto3==1.4.4
imports:
  - requirements/base. 
Run Code Online (Sandbox Code Playgroud)

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

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

alk*_*mid 127

尝试使用conda env update:

source activate myenv
conda env update --file local.yml
Run Code Online (Sandbox Code Playgroud)

  • 你不需要`-f`和`file.yml`之间的等号.删除等号将使标签完成工作在`.yml`文件名. (12认同)
  • 在最新的 conda 版本中,我认为我们使用“conda activate myenv”而不是“source activate myenv” (3认同)
  • 在`local.yml`中添加`--name env_name`来忽略任何`name:foo`标签。也避免了先激活myenv的需要。完整命令:`conda env update --name env_name --file local.yml`来自:/sf/answers/3186791541/的注释 (2认同)
  • 确保 YAML 文件没有“name”参数,否则它会使用此 **update** 命令**创建** (2认同)

Dav*_*ave 19

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

source deactivate;
conda env update -f whatever.yml;
source activate my_environment_name; # Must be AFTER the conda env update line!
Run Code Online (Sandbox Code Playgroud)

  • @ThomasFauskanger如果已通过conda导出,则在YAML文件中指定环境的名称. (16认同)
  • @ThomasFauskanger您可以使用`-n <environment name>`显式指定它,但默认情况下它似乎适用于预期的环境(可能是最近活动的,或者只是默认的环境选择) (5认同)
  • 如果conda不是当前处于活动状态的环境,它怎么知道? (4认同)
  • 我认为这个问题的老点是将不同的环境更新为 yaml 文件中指定的环境。 (3认同)
  • @ThomasFauskanger yaml 文件包含环境名称 (2认同)

小智 15

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

conda env update -f local.yml --prune
Run Code Online (Sandbox Code Playgroud)

  • 即使 **--prune** 标志也不足以删除 pip 安装的依赖项...... (4认同)