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

357

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

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

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

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


1
能否更新当前激活的环境?我刚试过了,但是更新操作会应用到 yml 文件中指定的环境。 - Soren
这可能对从头开始很有用:conda env create -f ~/CoqGym/coq_gym.yml(参见:https://dev59.com/ELHma4cB1Zd3GeqPNZCR) - Charlie Parker
4个回答

555

尝试使用conda env update

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

--prune 卸载从 local.yml 中删除的依赖项,如 @Blink 在 this answer 中指出的。

注意:如果在 local.yml 中有一个名称不同于您的环境名称的 name 标签,则上述命令将创建一个新的具有该名称的环境。为避免这种情况,请使用以下命令(感谢 @NumesSanguis):

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

请参阅 Conda 用户指南中的 更新环境

20
-ffile.yml之间不需要等号。移除等号将使得在yml文件名上使用制表符自动补全功能。 - BallpointBen
23
local.yml中添加 --name env_name 来忽略任何 name: foo 标签。这还可以避免先激活 myenv。完整命令:conda env update --name env_name --file local.yml - NumesSanguis
3
最新版本的conda中,我认为我们使用“conda activate myenv”而不是“source activate myenv”。 - lightbox142
2
确保YAML文件没有name参数,否则使用此update命令会创建它。 - Dima Lituiev
1
@DimaLituiev,您能澄清一下“否则它将使用此更新命令创建”的意思吗?如果名称已经存在会有什么问题吗?另外,底部的前缀词会创建问题吗? - Charlie Parker
显示剩余5条评论

80

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

conda env update -f local.yml --prune

4
即使使用了 --prune 参数,也不足以移除通过 pip 安装的依赖包... - Jean Paul
正确。我认为它会删除conda依赖项,但不会删除在pip下列出的依赖项。 - Blink
1
有没有办法可以传递一个参数,使得该命令只会更新.yml文件中可用的库,从而确保在任何列出的库不可用时不会抛出错误? - dan
1
如果我的 requirements.yml 文件顶部有一个 name:,会出现问题吗? - Charlie Parker

35

alkamid的回答是正确的,但我发现如果环境已经激活,Conda无法安装新的依赖项。先停用环境可以解决这个问题:

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

7
如果当前活动的环境不是要更新的环境,conda 如何知道要更新哪个环境? - Thomas Fauskanger
6
@ThomasFauskanger,您可以使用“-n <环境名称>”来明确指定它,但默认情况下它似乎与预期的环境一起工作(可能是最近活动的环境,或者只是一个默认的环境选择)。 - Dave
21
@ThomasFauskanger 如果环境已由conda导出,则环境的名称在YAML文件中指定。 - Thomas
5
我认为这个问题的旧观点是将一个不同的环境更新到yaml文件中指定的环境。 - Giacomo
2
@ThomasFauskanger yaml文件包含了环境名称。 - Abdulrahman Bres

1
最近,Conda引入了堆栈环境的选项,这应该能解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接