【问题标题】:How to recreate Conda environment with a single command如何使用单个命令重新创建 Conda 环境
【发布时间】:2022-06-10 20:03:14
【问题描述】:

我必须同时使用 Conda 和 pip,因为我需要的一些包只能通过 Conda 获得,而其他包只能通过 PyPI 获得。

我正在仔细关注this guide,以免我的环境处于损坏状态。

请注意以下摘录:

在 pip 之后运行 conda 可能会覆盖并可能 中断通过 pip 安装的软件包。同样,pip 可能会升级或删除 conda 安装包需要的包。

为所需的所有其他软件创建 conda 包是一个 构建数据科学环境的可靠安全方法 但如果环境涉及大量 仅在 PyPI 上可用的软件包。在这些情况下,使用 pip 只有在通过 conda 安装了所有其他要求之后 最安全的做法。

只有在使用 conda 安装尽可能多的包之后 应该使用 pip 来安装任何剩余的软件。 如果 需要对环境进行修改,最好创建一个 新环境,而不是在 pip 之后运行 conda。

因此,我经常需要删除并重新创建我的 Conda 环境。

这是我的做法:

# Dump the environment to a file
$ conda env export > environment.yml

# Deactivate the environment, so it becomes deletable
$ conda deactivate

# Delete the environment
$ conda env remove -n my-env

# Recreate the environment from the file
$ conda env create -f environment.yml -v

# Activate the new environment
$ conda activate my-env

有没有更简单的方法来使用 one 命令完成所有这些操作?

我想我可以编写一个 shell 脚本,但有些命令需要任意时间才能完成,而且我不知道如何正确计时。

conda env recreate 这样的东西是理想的。

【问题讨论】:

  • 您可以手动将所有包添加到 environment.yaml 文件中,以及 pip 包:stackoverflow.com/questions/35245401/…
  • 如果我的问题不清楚,我深表歉意。我已经有一个包含 conda 和 pip 要求的文件 (environment.yml),所以这部分没问题。我试图弄清楚如何使用单个命令而不是手动执行五个命令来删除和重新创建我的环境。
  • 为什么 bash 脚本不等待每个命令完成后再运行下一个命令?
  • 它会自动执行吗?我对 bash 脚本不是很熟悉,所以我推测(可能是错误的)它不会自动处理计时和异常。
  • 你可以用&&链接所有这些命令

标签: python pip conda


【解决方案1】:

您可以通过先克隆环境然后添加顺序命令行来实现此目的:

conda create --name new_env_name --clone old_env_name && conda remove --name old_env_name --all

这里的&& 表示第二个命令(删除旧环境)只有在第一个退出并返回代码成功时才会运行

如果您绝对需要保持相同的环境名称,请这样做:

conda create --name env_name2 --clone env_name && conda remove --name env_name --all && conda create --name env_name --clone env_name2 && conda remove --name env_name2 --all

所以,基本上你将它克隆为另一个名称 (2),删除旧的 env,将新的重新克隆为以前的名称,删除到以前的克隆 (2),完成!

【讨论】:

  • 嘿,这很好!我不知道--clone 选项。当我尝试运行该命令时,我收到一个错误EnvironmentLocationNotFound: Not a conda environment: ~/opt/miniconda3/envs/my-env,可能是因为它试图以错误的顺序创建和删除具有相同名称的环境(我需要保留名称)。
  • 是的,要克隆你必须使用不同的环境名称,否则它将不起作用。此外,EnvironmentLocationNotFound 正在标记您传递给 clone 的名称可能不存在?如果你在克隆前删除,它不会起作用
  • 请检查我编辑过的答案,以获取使用双重克隆保持相同环境名称的解决方法
【解决方案2】:

我通过写一个shell脚本conda_env_recreate.sh解决了这个问题:

#!/usr/bin/env zsh

env_file='environment.yml'
env_name='my-env'

echo 'Dumping Conda environment to file.'
conda env export --name $env_name > 'new_'$env_file

echo 'Deactivating Conda environment.'
conda deactivate

echo 'Deleting Conda environment.'
conda env remove -n $env_name

echo 'Recreating Conda environment from file.'
conda env create -f $env_file -v

echo 'Reactivating Conda environment.'
conda activate $env_name

然后我像这样运行它:

source conda_env_recreate.sh

【讨论】:

  • 你不需要激活环境只导出它,然后再去激活,你可以像这样简单地做一行:conda env export --name $env_name > $temp_filename
  • 在另一个注意事项上,一旦你的包解决了,你为什么不简单地在你的代码包上保留一个 environment_file.yml 呢?这样您就可以删除旧环境并从系统上的同一 yml 文件创建新环境
  • @nferreira78 感谢您的建议!我在 Git 中使用了许多分支。我在其他分支中安装了不同的软件包。在它们之间切换时,我需要从活动分支中的文件重新创建我的环境。
  • 另外,必须先停用环境才能删除它,否则我会收到错误消息:CondaEnvironmentError: cannot remove current environment. deactivate and run conda remove again
  • 在反馈后更新了我的答案中的脚本,以更好地适应我的工作流程。这样,new_environment.yml 将包含我的 Conda 环境重新创建之前的样子。并且将根据源代码管理中的旧environment.yml 重新创建环境。然后我可以根据需要比较这些环境文件并保留正确的。
猜你喜欢
  • 2018-12-22
  • 2016-12-19
  • 2020-04-08
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2014-08-04
相关资源
最近更新 更多