Miniconda 是一个 python 简约发行版,集成了 python、pip、conda 等,利用 conda 进行 python 软件包管理非常方便。另外,也可以为特定的项目创建特定的运行环境,再结合 jupyter 等能够非常方便切换各种独立环境。下面给出如何利用 conda 创建特定环境、配置不同 jupyter kernel 以及环境迁移。

安装 Miniconda

从官网下载 miniconda 并安装

1
2
3
4
# 安装最新版 miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod +x Miniconda3*
./Miniconda3*

其他历史版本请从 miniconda archive 官网下载。

安装特定环境

conda update

创建新的环境,命名为 toplayer,安装 python 版本 3.8

1
2
3
4
5
6
7
8
# 如果安装 miniconda 时没有初始化,需要初始化,重新登陆
conda init
# 如果不想 conda 环境在启动 shell 时被激活,可以使用如下方法设置
conda config --set auto_activate_base false

# 建议安装 jupyterlab,这样在虚拟环境中就可以不用安装了
# 该代码针对本篇第3节
pip install jupyterlab

如果长时间未更新 conda,可以使用下面方式更新:

1
conda update -n base -c defaults conda

创建虚拟环境

1
2
3
4
5
6
# 安装虚拟环境
conda create -n toplayer python=3.8
# 激活虚拟环境
conda activate toplayer
# 退出虚拟环境
conda deactivate

或者通过 yaml 创建虚拟环境,具体地,首先编写 yaml 配置文件,这里命名随便,如 test.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
name: toplayer
channels:
- conda-forge
- defaults
dependencies:
- python=3.8
- pip
- jupyter
- nb_conda
- ffmpeg
- pip:
- scipy
- sympy

然后,使用如下命令安装:

1
conda env create -f test.yaml

删除虚拟环境

1
2
# 删除虚拟环境
conda remove -n toplayer --all

注意,conda 版本要求 4.6+

列出所有安装的环境

1
2
3
4
# 在主环境下
conda env list
# 或者
conda info -e

安装 jupyter kernel

在虚拟环境安装需要的软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 首先激活虚拟环境
conda activate toplayer

# 安装需要软件
conda install ipython jupyterlab
# 如果在 base 主环境中已经安装了 jupyterlab,那么可以只需要安装 ipykernel
pip install ipykernel ipywidgets

# 在虚拟环境安装 jupyter kernel,并命名
python -m ipykernel install --user --name toplayer --display-name "Python3(toplayer)"

# 在主环境中打开 jupyterlab
conda deactivate
# 注意这里尝试退出虚拟环境,并进入到主环境,主环境以 base 显示,如果没有显示任何环境名,可以使用如下命令进入主环境
conda activate
# 打开 jupyterlab
jupyterlab

此时,刷新 jupyter notebook 就可以从 kernel 中看到名为 Python3(toplayer) 的 kernel

ipynb文件过大,导致加载慢

加载慢大多是因为 ipynb 运行结果多导致的,可以尝试清空每个单元格的结果。通过命令行,可以实现:

1
2
3
4
5
# 保留原 ipynb,导出一个没有输出结果的 ipynb
jupyter nbconvert --ClearOutputPreprocessor.enabled=True --to notebook --output=NotebookNoOut large_ipynb.ipynb

# 直接清空 ipynb 的输出结果
jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace large_ipynb.ipynb

卸载不想要的 jupyter kernel

查看有哪些 jupyter kernel

1
jupyter kernelspec list

显示结果如下(示例)

1
2
3
4
5
Available kernels:
perslay /home/jinzhongxu/.local/share/jupyter/kernels/perslay
toplayer /home/jinzhongxu/.local/share/jupyter/kernels/toplayer
python3 /usr/local/miniconda/share/jupyter/kernels/python3
c /usr/local/share/jupyter/kernels/c

删除不需要的 kernel

1
2
3
jupyter kernelspec uninstall toplayer
jupyter kernelspec uninstall perslay
jupyter kernelspec uninstall c

环境迁移

适用于纯 pip 安装的包

把包写入文件

1
2
3
4
# 可能包含类似 file:///tmp/... 这样的内容,不方便安装
python -m pip freeze > requirements.txt
# 或者,只列出包和版本信息。推荐
python -m pip list --format=freeze > requirements.txt

安装

1
python -m pip install -r requirements.txt

适用于纯 conda 安装的包

假设已经安装有 miniconda 或 anaconda,并配置好环境变量。

把包写入文件

1
2
3
conda list --export > requirements.txt
# or
conda list -e > requirements.txt

安装

1
conda create --name <env> --file requirements.txt

适用于 conda 和 pip 混合安装的包

假设已经安装有 miniconda 或 anaconda,并配置好环境变量。同时,conda init <bash/zsh> 已经激活

把包写入文件

1
2
3
4
# 先进入环境
conda activate <env>
# 把环境信息写入环境配置文件。yaml 里的 name 可以根据自己喜好改写
conda env export > environment.yaml

安装

在新的服务器上已经安装好 miniconda 或 anaconda,并配置好环境变量。同时,conda init <bash/zsh> 已经激活

1
2
# 直接根据配置文件创建环境
conda env create -f environment.yaml

迁移到无网络环境机器上

当我们想要把外网(能够连接互联网)上的某个 conda 环境(如:/usr/local/miniconda/envs/sam)迁移到内网(不能够连接互联网)上的某个机器上。我们可以直接把外网的带迁移的 conda 环境打包到内网机器上(需要内网机器安装了 conda),基本步骤如下:

  1. 下载 miniconda.sh、打包压缩 /usr/local/miniconda/envs/samsam.zip
  2. 拷贝 miniconda.shsam.zip 到内网机器;
  3. 在内网机器先安装 miniconda.sh,添加到环境变量,然后激活 conda:conda init
  4. 解压 sam.zip,如解压到 /root/sam
  5. 克隆 /root/sam 到 conda 新环境:
    1
    conda create -n sam-new --clone /root/sam

在第5步中或者直接解压 sam.zip 到一个目录,即可使用。使用时请使用完整 Python 路径

另一种解决方法是使用包 conda-pack:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
pip install conda-pack

# 打包环境
# Pack environment env_name into env_name.tar.gz
conda pack -n env_name

# Pack environment env_name into new_name.tar.gz
conda pack -n env_name -o new_name.tar.gz

# Pack environment located at an explicit path into my_env.tar.gz
conda pack -p /explicit/path/to/env_name

# 在新机器上配置环境
# Unpack environment into directory `env_name`
mkdir -p env_name
tar -xzf env_name.tar.gz -C new_env_path

# Use Python without activating or fixing the prefixes. Most Python
# libraries will work fine, but things that require prefix cleanups
# will fail.
./env_name/bin/python

# Activate the environment. This adds `env_name/bin` to your path
source env_name/bin/activate

# Run Python from in the environment
(env_name) $ python

# Cleanup prefixes from in the active environment.
# Note that this command can also be run without activating the environment
# as long as some version of Python is already installed on the machine.
(env_name) $ conda-unpack

多虚拟环境运行程序

对于创建有多个虚拟环境的服务器,当运行 python 程序时会调用哪个虚拟环境中的模块呢?

一句话,你使用哪个虚拟环境中的 python 就调用哪个虚拟环境中的模块.

因此,建议在命令行运行程序时使用 python 的完整路径,如:

1
2
3
4
5
# 调用 base 环境中的模块
/usr/local/miniconda/bin/python main.py

# 调用 deeplabcut 环境中的模块
/usr/local/miniconda/env/deeplabcut/bin/python main.py

参考链接

  1. Adding An Environment to Jupyter Notebooks
  2. 用conda创建python虚拟环境
  3. pip freeze