如何在 conda 包中设置环境变量,以便在激活包含该包的环境时设置它们?

Posted

技术标签:

【中文标题】如何在 conda 包中设置环境变量,以便在激活包含该包的环境时设置它们?【英文标题】:How to set environment variables in a conda package so they are set when an environment containing that package is activated? 【发布时间】:2020-04-15 19:42:44 【问题描述】:

我知道我可以在环境中的 activate.d 目录中创建一个 env_vars.(bat|sh),但是我希望将变量作为包的一部分包含在内,因此如果包被换成不同的版本,它会改变环境变量。

根据此处的文档:https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#saving-environment-variables,我应该能够创建一个 env_vars.(bat|sh) 作为 conda 包的一部分

这种类型的脚本文件可以是 conda 包的一部分,在这种情况下,这些环境变量会在包含该包的环境被激活时激活。

您可以随意命名这些脚本。但是,多个包可能会创建脚本文件,因此请务必使用其他包不使用的描述性名称。一种流行的选择是以 packagename-scriptname.sh 的形式为脚本命名,或者在 Windows 上为 packagename-scriptname.bat。

我尝试创建 env_vars.bat 和 packagename-env_vars.bat,然后按照文档中的说明设置环境变量,但安装包和激活环境不会创建变量。我还需要执行其他步骤吗?

我的 meta.yml:

package:
  name: maya
  version: 2020

我的 env_vars.bat:

set MAYA_VERSION=2020
set MAYA_LOCATION="C:\Program Files\Autodesk\Maya%MAYA_VERSION%"

【问题讨论】:

您是否按照文档中的说明将 ènv_vars.bat 复制到 etc 文件夹?激活脚本需要复制到%CONDA_PREFIX%\etc\conda\activate.d文件夹下,否则无法使用。 我需要手动执行吗?有没有一种自动化的方法可以在安装包时执行它,并在删除包时删除它们? 我看到有可以复制 env_vars 的激活脚本:docs.conda.io/projects/conda-build/en/latest/resources/… 虽然它确实说:“通常建议在其他选项可能时避免使用激活脚本”还有哪些其他选项? 【参考方案1】:

正如 cel 提到的,env_vars 需要复制到 activate.d 文件夹中。我对 conda 了解得不够多,不知道当文档说包可以包含这些脚本时,实际上必须复制这些脚本时,脚本不会自动运行。

实际上有两个env_var.bat文件:一个是在环境激活时设置变量,另一个是在环境停用时取消设置变量。

ma​​ya-activate-env_vars.bat

@echo off
set MAYA_VERSION=2020
set MAYA_LOCATION="C:\Program Files\Autodesk\Maya%MAYA_VERSION%"

ma​​ya-deactivate-env_vars.bat

@echo off
set MAYA_VERSION=
set MAYA_LOCATION=

缺少的部分是在安装软件包时将 *env_vars.bat 文件复制到正确 (de)activate.d 目录的 bld.bat 脚本:

bld.bat

setlocal EnableDelayedExpansion
for %%F in (activate deactivate) DO (
    if not exist %PREFIX%\etc\conda\%%F.d mkdir %PREFIX%\etc\conda\%%F.d
    copy %RECIPE_DIR%\maya-%%F-env_vars.bat %PREFIX%\etc\conda\%%F.d\%PKG_NAME%-%%F-env_vars.bat
)

需要注意的是,如果你删除了包,然后停用环境,变量将保留,因为 deactivate.d 中的 env_vars 将被删除,因此变量永远不会取消设置。您可以在使用 -n 标志停用环境后删除软件包来解决此问题。

【讨论】:

以上是关于如何在 conda 包中设置环境变量,以便在激活包含该包的环境时设置它们?的主要内容,如果未能解决你的问题,请参考以下文章

如何在虚拟 conda 环境中设置 streamlit 的路径

conda常用命令之–虚拟环境管理(教你如何创建激活重命名删除虚拟环境)

如何在AWS Almbda中设置环境变量或使用即时客户端库

Conda 常用的命令

安装jdk1.5.0_18。在catalina.sh中设置环境变量

Anaconda与Conda基本操作