bash脚本中conda环境的转换
环境隔离
现在很多github上的项目在安装的时候都需要新建一个conda环境,建立环境是方便不同工具的版本隔离,不隔离起来工具之间会乱套。
除了conda环境之外,也有pyenv、docker、虚拟机等等,其实它们都是起到了隔离的作用,隔离的作用范围我理解的大致为:
因为深度学习的火热,主要和python相关的conda工具是目前常用的环境管理方式,特别是在python3.8之后和python3.7之前的大的差异,环境的隔离是很有必要的。不方便的就是不同环境下工具调用时需要不断的conda activate
和conda deactivate
。现在打这俩命令我已经形成肌肉记忆,如果用计算机记录我的打字频率,在这个时候绝对是100000APM,其他时候除了ctrl+c
、ctrl+v
就没能像这样快的了。
对生信来说环境隔离也很有必要,因为生信工具的开发人员喜好不同或者是之前的系统环境懒得折腾(除非服务器烧掉),有的甚至还在python2.7下编写代码,不用conda环境来管理版本就让人很抓狂。除此之外,还有一个非常好用的工具jupyer lab可以在不同环境下使用。
最近我需要在一个conda环境下的python脚本里面使用subprocess来调用其他conda环境下的工具,按照常规思路行不通。最开始考虑的是进程之间的通信,但是感觉没有那个必要。
1 | import subprocess |
这样是不行的。出现错误:
1 | CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. |
在子shell进程下似乎conda没办法直接activate。
准备工作
这是第一篇介绍conda的文章,就把conda安装的步骤写一下。
conda分为anaconda和miniconda3两个类型,miniconda3是anaconda的精简版本,主要功能没有少,就是少了一些模块一些其他软件功能比如spyder啥的,因为后面主要是在子环境下运行,而子环境需要重新装模块,所以只需要用miniconda3就可以,如果有必要再用conda命令装就是了。
使用清华的miniconda3镜像下载:
1 | # 找一个比较新的日期的conda版本下载就行,不一定需要最新的版本 |
直接回车:
1 | Welcome to Miniconda3 py39_23.9.0-0 |
按空格到这里输入yes
1 | Do you accept the license terms? [yes|no] |
直接回车
1 | Miniconda3 will now be installed into this location: |
初始化 miniconda,输入 yes
1 | installation finished. |
设置不自动激活base环境:
1 | conda config --set auto_activate_base false |
到这里主要步骤完成,可以再配置一下下载的源什么的
环境的创建
这里随便创建3个环境用来后面问题的描述
1 | conda create --name 环境1 |
查看目前的环境:
1
2
3
4
5
6
7
8 conda env list
# conda environments:
#
# base * /home/xxx/miniconda3
# 环境1 /home/xxx/miniconda3/envs/环境1
# 环境2 /home/xxx/miniconda3/envs/环境2
# 环境3 /home/xxx/miniconda3/envs/环境3乱七八糟的环境创建太多,很烦,移除环境命令为:
1 conda remove --name 环境1 --all
bash脚本的conda环境转换
如果你目前位于base环境下,可以使用下面的代码在bash脚本中激活环境:
1 | # 执行代码 |
上面的方式不能在已经存在conda的环境下在bash脚本中进行切换。
如果你本来就在conda的环境下,比如在环境1
下面,需要在bash中更换为环境2
,这样在bash脚本这样写可以切换:
1 | # 如果是anaconda3就写成:source ~/anaconda3/etc/profile.d/conda.sh |
这样就方便使用python的subprocess进行批量的不同环境下的工具的使用。
1 | import subprocess |
参考
Python - Activate conda env through shell script
Can’t execute conda activate from bash script
Allow activating multiple environments
图片修改自: