Zexian Li

脚本切换conda环境踩坑记录

2021-05-29 · 3 min read
Linux

1. 修改启动项以实现Docker启动后自动切换conda环境

第一次踩坑是在项目中,甲方要求以封装启动脚本的形式实现Docker启动便运行程序的功能,而我的生产环境是在Docker内Anaconda下进行配置的。尽管Docker启动后conda会直接接管,但如何利用脚本切换到自己配置的环境,是亟待解决的问题。
最核心的问题是:与终端不同,Shell脚本中无法使用conda关键字。
最后的解决方法十分简单粗暴,通过conda init找到conda对应的.bashrc路径,修改其内容,加入如下指令:

source activate
conda deactivate
conda activate lzx

其原理是conda在启动时会执行conda对应的./bashrc的内容以进行初始化(我们平时打开终端其实也进行了执行.bashrc的过程,之所以conda会自动替代原生Python也是因为安装conda时其在.bashrc中注入了conda activate base命令)。
这种方法的确能实现项目需求,但明显不够优雅,迁移性也不高,如本文第二部分记录所示,有更好的方法。
吸取的教训主要有二,一是都用Docker了还加什么Anaconda,直接pip不香么;二是直接在conda主环境配置不好么,自己单开环境哪里香了?

2. 在cron定时执行的Shell脚本内实现conda的环境切换

第二次踩坑是在ubuntu下设置cron定时执行脚本但未执行,使用tail -f /var/log/cron.log实时查看日志缺发现对应文件不存在,通过blog解决问题。
后续遇到如下错误日志:

(CRON) info (No MTA installed, discarding output)

参照win_turn的博客,通过注释输出语句和安装邮件服务器解决了该问题。
此时我的脚本是这个样子的:

#!/usr/bin/env bash
source activate
conda deactivate
conda activate lzx
python /home1/lizexian/clock_in/clock_in.py  

通过不断查看/var/spool/mail文件夹下cron报错的邮件,最终的问题来到了老生常谈的shell不认conda关键字以及无法切换conda环境上。
绝境中发现以默的知乎解答,亲测使用此可以利用shell脚本激活及切换conda虚拟环境,原博实现如下:

#!/bin/bash
source /YOUR_CONDA_PATH/bin/activate your_env
python --version

对应到我个人的实现如下:

#!/bin/bash
source /home/user/anaconda3/bin/activate lzx
python /home1/lizexian/clock_in/clock_in.py

当然,在调试过程中还遇到了一些小麻烦,例如用chmod u+x a.sh赋予执行权限、将所有路径更改为绝对路径等(事实证明并非定要输入Python的绝对路径),此处不再赘述。

至此,妈妈再也不用担心我的conda环境了🎢

Bad decisions make good stories.