[Conda]环境激活钩子作用与应用
问题引入:
在研究Gromacs的数据分析时,需要用到gmxMMPBSA,需要在conda中创建环境,我在Linux中创建的环境,想要通过mobaXterm实现X11转发,将gmxMMPBSA的数据分析窗口从Linux转发到其他电脑进行分析,但是发现转发时候,找不到libxcb-cursor.so.0,经过解决发现这个库在conda环境中,终端识别到conda内部这个库的路径,因此我们需要引入环境变量,但是为了每次不需要手动引入,我尝试将环境变量引入到全局bashrc中
echo 'export 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.d deactivate.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
#编写文件
vim set_ld_library_path.sh#set_ld_library_path.sh
#!/bin/bash
export LD_LIBRARY_PATH=/home/guohui/miniconda3/envs/gmxMMPBSA/lib:$LD_LIBRARY_PATH
EOF#赋予脚本执行权限
chmod +x $CONDA_PREFIX/etc/conda/activate.d/set_ld_library_path.sh以上是激活时的钩子脚本,然后我们写清理脚本
#set_ld_library_path_deactivate.sh
#!/bin/bash
# 从 LD_LIBRARY_PATH 中移除我们之前添加的 Conda 环境 lib 目录
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH#$CONDA_PREFIX/lib:}如果你不需要手动清理,完全可以省略 deactivate.d 脚本,因为 Conda 默认会在 deactivate 时恢复环境变量。提供此脚本只是为了满足你的明确要求或追求额外保险。



