如何在 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文件:一个是在环境激活时设置变量,另一个是在环境停用时取消设置变量。
maya-activate-env_vars.bat
@echo off
set MAYA_VERSION=2020
set MAYA_LOCATION="C:\Program Files\Autodesk\Maya%MAYA_VERSION%"
maya-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常用命令之–虚拟环境管理(教你如何创建激活重命名删除虚拟环境)