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


135

如何用另一个.yml文件更新先前的conda环境。在具有多个需求文件(例如)的项目上工作时,这非常有用base.yml, local.yml, production.yml

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

碱基

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文件中命名的环境。
索伦

Answers:


200

尝试使用conda env update

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

或无需激活环境(感谢@NumesSanguis):

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

12
-f和之间不需要等号file.yml。删除等号将使制表符补全在.yml文件名上起作用。
BallpointBen

4
添加--name env_name以忽略中的任何name: foo标记local.yml。也避免了先激活myenv的需要。完整命令:conda env update --name env_name --file local.yml 来自:stackoverflow.com/a/45525593/3399066的评论
NumesSanguis,

1
在最新的conda版本中,我认为我们使用“ conda activate myenv”代替“ source activate myenv”
teter123f

30

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

conda env update -f local.yml --prune

甚至--prune标志也不足以删除点子安装的依赖项...
Jean Paul

真正。我认为它将删除conda依赖项,但不会删除pip下列出的依赖项
Blink

22

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

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

4
如果conda不是当前处于活动状态的环境,它怎么知道?
Thomas Fauskanger

5
您可以使用@ThomasFauskanger显式指定它-n <environment name>,但默认情况下,它似乎可以在预期的环境下工作(也许是最近活动的环境,或者只是默认的环境选择)
Dave

18
@ThomasFauskanger如果conda导出了环境名称,则在YAML文件中指定环境名称。
托马斯

我认为这个问题的主要目的是将一个不同的环境更新为yaml文件中指定的环境。
Giacomo

1
yaml文件中的@ThomasFauskanger包含环境名称
Abdulrahman Bres
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.