说明:本文中的例子大多为了方便说明进行了简化,不代表实际问题情形和实际解决方案,如需要严谨的定义和解决方案,请自行查阅相关文档。
使用前必读
conda是一个非常泛用且方便的包管理工具,尤其在科学计算、机器学习、统计分析等科研场景下,它可以帮助我们非常方便的处理各种依赖。
但是在Linux中,在base环境中使用conda是非常危险的,对于刚开始使用Linux的用户必须要清楚地意识到这一点。
我们在正式开始学习如何在Arch Linux上使用conda之前,请务必认真理解本节所讲述的内容。
包管理
在Linux中很多应用程序并不能单独运行,他们可能需要使用其他应用的功能来完成一些自己的功能,举一个最简单的例子,如果你希望安装一个图形化的软件,那么你大概率需要先安装qt、gtk或者其他类似的图形平台来让软件能够实现图像化。与Windows和MacOS上通常将软件本体及其所有依赖打包为一个单独的软件不同,在Linux上几乎所有软件(这里我们不讨论flatpak和Appimage等打包格式)都必须依赖于系统中的其他软件,这样做的好处是很明显的,假如两个软件A、B都依赖相同的软件C,我们就只需要安装一遍C就可以实现同时使用A、B和C三个软件,大大节省了磁盘空间。
但是这样做的坏处也很明显,我每次安装软件都需要去额外处理大量的依赖,这显然是非常巨量的工作。这时,聪明的你发现,如果有一个程序能够自动读取和处理软件的依赖列表,和当前系统中已有的软件包进行对比,自动补充缺少的软件包,不就解决这个问题了吗。于是,能够自动处理软件安装依赖的工具就诞生了,你给这破玩意儿起名叫做包管理器。
包管理器可以在安装软件时快速处理软件的依赖,让我们只用一行命令就可以完成安装。Linux的大部分软件需要我们使用包管理器来进行安装,例如在Arch Linux中,我们使用pacman作为包管理器。
在开发中,我们也常常需要调用第三方库来进行开发,而很多库之间也存在类似的依赖关系。聪明的你又想到,刚才的包管理器不也可以在这里使用吗?于是你又发明了一个额外的包管理器来处理开发中的第三方库,而conda就是一个典型的此类包管理器。
接下来,你的一切工作似乎的非常顺利,直到……
依赖冲突
某一天,你在开发时发现一个第三方库C似乎无法正常使用,你检查后发现你系统中的一个软件包D不符合它的需求,它依赖于另一个更老版本才提供的接口,然而,你的其他软件包大都只依赖新旧版本都有的接口。这就造成了依赖冲突。
为了解决这个问题,你又想到一个办法,你只需要在依赖说明添加上符合要求的版本,然后将所有依赖这个包的软件的需求取一个交集不就能解决这个问题了吗?于是你一通计算,1.14版本的D刚好能够满足你的需要,于是你使用语言包管理器将D软件包的版本修改为了1.14。
不可调和的依赖冲突与依赖污染
某一天,你发现自己的某个软件A突然无法正常使用了,你检查后发现,软件A需要的一个依赖D必须是5.14以上的版本,然而现在它变成了1.14的版本。这两个软件所依赖的软件包的版本完全对立不兼容,这就引发了不可调和的依赖冲突。
然后你一通检查发现你的其中一个包管理器在处理时由于使用了较旧的包,修改了D软件的版本,而你的另一个包管理对此一无所知,因此也没有注意到异常,就导致你现在使用出现问题,在更新时也无法正常解决D软件包的问题。恭喜你,发现了依赖污染问题。
这次的问题就不像之前那样容易解决了。于是你决定从源头着手彻底解决这类问题。
虚拟环境
你开始把开发时需要的依赖存放在一个单独的文件夹中与系统依赖(base
环境)彻底分开,这样两者就不会产生冲突,同时,针对不同的项目,你可以为每一个项目配置一份单独的依赖环境,彻底解决了上面的问题,你管这个新的发明叫做虚拟环境。
从此,通过虚拟环境与包管理器的配合,你和Arch过上了幸福的生活,真是可喜可贺,可喜可贺……
安装与使用Conda
通过上面的神人小剧场,我相信你已经理解了包管理器和虚拟环境的意义,以及为什么不应该在Linux的base环境中使用conda。接下来我们开始解决问题:如何安装和正确使用conda?
安装
我们通过官网脚本安装miniconda3,这是一个最小的conda版本,不提供额外的依赖,防止conda直接破坏系统环境。
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
之后一路 yes即可。直到 conda init的时候,选择 no记录下安装的 miniconda 的位置,一般默认 ~/miniconda3 下。接下来照着提示修改环境变量即可。
添加环境变量,本来是 PATH=~/miniconda3/bin:$PATH,修改为PATH=$PATH:~/miniconda3/bin,因为在安装软件时使用 conda
作为基础 Python 环境时会发生错误,要求使用系统自带的 Python3。
使用vim编辑.zshrc文件
eval "$(~/miniconda3/bin/conda shell.zsh hook)"
export PATH=$PATH:~/miniconda3/bin
激活配置:
source .zshrc
我们需要在新环境而不是 base 环境中安装新软件包。为了避免 Conda 自动激活 base 环境,编辑~/.condarc
auto_activate_base: false
添加默认软件包
在 ~/.condarc中添加create_default_packages 部分。例如:
create_default_packages:
- pip
- ipython
- numpy
- pandas
- scipy
- libgcc-ng
- mpich
- rust
创建环境
要使用上一节中指定的默认软件包创建名为 myenv 的新环境,请运行
conda create --name myenv
要创建不带默认软件包的新环境,请运行
conda create --no-default-packages --name myenv
要创建具有指定 Python 版本和软件包的环境,请运行
$ conda create --name myenv python=3.9 numpy=1.23.5 astropy
要激活环境
conda activate myenv
列出环境
要列出所有环境
conda env list
克隆环境
conda create --name myenvclone --clone myenv
移除环境
$ conda remove --name myenv --all
导出和导入环境
要导出 myenv 环境中的所有软件包
conda activate myenv
conda env export > myenv.yml
如果您只想包含您显式安装的软件包,请在导出时添加 --from-history 标志。
conda env export --from-history > myenv.yml
要从 myenv.yml 创建新环境,请运行
conda env create -f myenv.yml



