之前的 python
开发项目中,一直是使用python自带的 pip venv
管理虚拟环境,它只能基于当前服务器已存在的 python
的版本来创建虚拟环境,比如你的服务器上安装的 python
版本是3.8,那么创建的虚拟环境都是基于这个版本,如果想要一个基于 python 3.10
的虚拟环境,则需要先在服务器上安装这个版本才行。
而 conda
可以指定 python
版本来创建虚拟环境。
安装miniconda3:
以下步骤创建安装目录(这里的安装目录是 /data/miniconda3
),下载并运行安装脚本,删除安装脚本,运行以一下初始化程序。
mkdir -p /data/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /data/miniconda3/miniconda.sh
bash /data/miniconda3/miniconda.sh -b -u -p /data/miniconda3
rm -rf /data/miniconda3/miniconda.sh
/data/miniconda3/bin/conda init bash
完成后重启当前 shell
,运行 conda info
,可以看到类似的信息:
(base) root@8500t:~/.conda$ conda info
active environment : base
active env location : /data/miniconda3
shell level : 1
user config file : /home/root/.condarc
populated config files :
conda version : 24.1.2
conda-build version : not installed
python version : 3.12.1.final.0
solver : libmamba (default)
virtual packages : __archspec=1=skylake
__conda=24.1.2=0
__glibc=2.35=0
__linux=5.15.0=0
__unix=0=0
base environment : /data/miniconda3 (writable)
conda av data dir : /data/miniconda3/etc/conda
conda av metadata url : None
channel URLs : https://repo.anaconda.com/pkgs/main/linux-64
https://repo.anaconda.com/pkgs/main/noarch
https://repo.anaconda.com/pkgs/r/linux-64
https://repo.anaconda.com/pkgs/r/noarch
package cache : /data/miniconda3/pkgs
/home/root/.conda/pkgs
envs directories : /data/miniconda3/envs
/home/root/.conda/envs
platform : linux-64
user-agent : conda/24.1.2 requests/2.31.0 CPython/3.12.1 Linux/5.15.0-101-generic ubuntu/22.04.3 glibc/2.35 solver/libmamba conda-libmamba-solver/23.12.0 libmambapy/1.5.3
UID:GID : 1000:1000
netrc file : None
offline mode : False
从这里可以看到,当前安装 conda
带的 python
版本 python version : 3.12.1.final.0
,用户配置文件在 /home/root/.condarc
,这个文件来设置镜像源。
设置镜像源
设置为清华源,参考:https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/
将以下信息复制到配置文件 /home/root/.condarc
中:
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
运行 conda clean -i 清除索引缓存,保证用的是镜像站提供的索引。
操作虚拟环境
这里我们指定 python
版本为 3.8
来创建一个虚拟环境 test1
:
# 创建环境
conda create -n test1 python=3.8
等待安装完成后,即可激活环境来验证是否安装成功。
# 激活环境并查看python版本
conda activate test1
python -V
# 输出:Python 3.8.19
可以看到, python 3.8.19
已经安装好了,相比较 pip
需要提前安装不同的 python
版本, conda
方便很多。
其他一些与环境相关的命令:
# 查看已创建的环境
conda env list
# 删除环境
conda env remove -n ENVNAME
包管理
# 查看已安装的包
conda list
# 查看是否已安装指定包
conda list PACKAGE_NAME
# 搜索可用的包
conda search PACKAGE_NAME
# 安装包
conda install PACKAGE_NAME
# 指定版本安装包
conda install PACKAGE_NAME=VERSION
# 更新包
conda update PACKAGE_NAME
# 更新所有包
conda update --all
# 删除包
conda remove PACKAGE_NAME
导出虚拟环境
# 导出当前虚拟环境
conda env export > environment.yml
# 在base环境中导出虚拟环境 ENVNAME
conda env export -n ENVNAME > environment.yml
这样导出的文件示例:
name: test1
channels:
- defaults
dependencies:
- _libgcc_mutex=0.1=main
- _openmp_mutex=5.1=1_gnu
- brotli-python=1.0.9=py38h6a678d5_7
- ca-certificates=2024.3.11=h06a4308_0
- certifi=2024.2.2=py38h06a4308_0
- cffi=1.16.0=py38h5eee18b_0
- charset-normalizer=2.0.4=pyhd3eb1b0_0
- cryptography=42.0.5=py38hdda0065_0
- idna=3.4=py38h06a4308_0
- ld_impl_linux-64=2.38=h1181459_1
- libffi=3.4.4=h6a678d5_0
- libgcc-ng=11.2.0=h1234567_1
- libgomp=11.2.0=h1234567_1
- libstdcxx-ng=11.2.0=h1234567_1
- ncurses=6.4=h6a678d5_0
- openssl=3.0.13=h7f8727e_0
- pip=23.3.1=py38h06a4308_0
- pycparser=2.21=pyhd3eb1b0_0
- pyopenssl=24.0.0=py38h06a4308_0
- pysocks=1.7.1=py38h06a4308_0
- python=3.8.19=h955ad1f_0
- readline=8.2=h5eee18b_0
- requests=2.28.1=py38h06a4308_1
- setuptools=68.2.2=py38h06a4308_0
- sqlite=3.41.2=h5eee18b_0
- tk=8.6.12=h1ccaba5_0
- urllib3=1.26.18=py38h06a4308_0
- wheel=0.41.2=py38h06a4308_0
- xz=5.4.6=h5eee18b_0
- zlib=1.2.13=h5eee18b_0
prefix: /data/miniconda3/envs/test1
这样导出的 environment.yml
中包含了所有的依赖包,一个大型项目将会导出非常多包,而且当项目需要跨平台运行时,有的依赖包并不能适配所有平台导致运行失败,这时候可以选择导出精简版:
conda env export --from-history > environment.yml
使用 --from-history
导出的文件示例:
name: test1
channels:
- defaults
dependencies:
- python=3.8
- requests=2.28.1
prefix: /data/miniconda3/envs/test1
导出的包是否有版本号取决于安装时是否指定版本号。
导入虚拟环境
上面导出的虚拟环境加入版本库或者到别的服务器上,导入即可。
conda env create -n ENVNAME --file environment.yml
由于在 environment.yml
文件的第一行有指定环境名称,在不使用 -n
指定环境名称时,将会沿用文件中的名称。