[Conda]环境激活钩子作用与应用

张开发
2026/4/6 7:44:58 15 分钟阅读

分享文章

[Conda]环境激活钩子作用与应用
问题引入在研究Gromacs的数据分析时需要用到gmxMMPBSA需要在conda中创建环境我在Linux中创建的环境想要通过mobaXterm实现X11转发将gmxMMPBSA的数据分析窗口从Linux转发到其他电脑进行分析但是发现转发时候找不到libxcb-cursor.so.0经过解决发现这个库在conda环境中终端识别到conda内部这个库的路径因此我们需要引入环境变量但是为了每次不需要手动引入我尝试将环境变量引入到全局bashrc中echoexport LD_LIBRARY_PATH/home/guohui/miniconda3/envs/gmxMMPBSA/lib:$LD_LIBRARY_PATH~/.bashrc但这样做的局限性很明显每次我们启动终端都会引入一个特定的conda环境中的某个变量这有可能会隐含环境冲突。在Linux系统中我们时常要在终端中引入环境变量有时为了环境的独立互不影响我们一般尽量不会在~/.bashrc中去引入在conda中我们使用conda的目的即是为了环境独立但是不想要每次激活都去手动去做一些重复性操作conda为我们提供了一种方法即激活钩子。激活钩子在conda中我们切换环境相当于切换python的解释器和pip的环境包同时去调用钩子目录下面的可执行脚本。一般钩子目录在conda环境下的etc/conda/目录下面可以通过cd $CONDA_PREFIX进入conda的环境目录而conda钩子目录在环境目录下etc/conda目录下。在此目录下你能看到有两个主要目录activate.ddeactivate.d//找到C工大环境下的钩子目录mkdir-p$CONDA_PREFIX/etc/conda/activate.d //进入conda钩子目录的上级目录cd$CONDA_PREFIX/etc/conda接下来我们看一下钩子目录下activate.d目录下是在激活时执行的所有脚本包含shell脚本或Windows下bat脚本deactivate.d目录下是环境退出时执行的清理脚本即清理掉之前activate.d下脚本引入的环境变量目的是为了避免环境污染。但是有些脚本没有清理脚本这不是必须的但是最好为每个脚本都编写一个清理脚本。示例脚本我们去解决上面所提出的问题在每次环境激活都去引入一个libxcb-cursor.so.0库的环境变量我们即现在activate.d目录下编写一个set_ld_library_path.sh#进入目录cd$CONDA_PREFIX/etc/conda/activate.d#编写文件vimset_ld_library_path.sh#set_ld_library_path.sh#!/bin/bashexportLD_LIBRARY_PATH/home/guohui/miniconda3/envs/gmxMMPBSA/lib:$LD_LIBRARY_PATHEOF#赋予脚本执行权限chmodx$CONDA_PREFIX/etc/conda/activate.d/set_ld_library_path.sh以上是激活时的钩子脚本然后我们写清理脚本#set_ld_library_path_deactivate.sh#!/bin/bash# 从 LD_LIBRARY_PATH 中移除我们之前添加的 Conda 环境 lib 目录exportLD_LIBRARY_PATH${LD_LIBRARY_PATH#$CONDA_PREFIX/lib:}如果你不需要手动清理完全可以省略deactivate.d脚本因为 Conda 默认会在 deactivate 时恢复环境变量。提供此脚本只是为了满足你的明确要求或追求额外保险。个人博客文章地址https://blog.huimy.top/13/577.html

更多文章