使用Conda来管理Python虚拟环境

使用Conda来管理Python虚拟环境

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

简介

Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。 Conda 是为 Python 程序创建的,适用于 Linux,OS X 和Windows,也可以打包和分发其他软件。

Conda 分为 anaconda 和 miniconda。anaconda 包含了大量的科学计算相关包,所以体积较大,miniconda 则是精简版,需要用什么自己装什么就好,所以推荐使用 miniconda。

下面附上 miniconda 的下载地址:https://docs.conda.io/en/latest/miniconda.html

miniconda 本身也依赖于 Python,所以在下载页中可以看到提供了各种 Python 版本对应的 miniconda 安装包,如下:

image.png

下载好适合你自己的环境的 miniconda 安装包之后,安装操作就很简单了,下面就对安装操作简单的描述一下:

  • 对于 Windows 版本的 miniconda 安装包,提供的是 exe 文件,所以双击下一步就能完成安装。
  • 对于 Linux 版本的 miniconda 安装包,提供的是 bash 文件,直接 bash <安装包> 就可开始交互式安装操作,按提示进行就行。
  • 对于 Mac OS 版本的 miniconda 安装包,提供了两种类型的安装文件,一种是 bash 文件,安装方式同 Linux,另一种类型的是 pkg 安装包,同样是双击下一步即可。

使用

我这里使用的是 Mac OS 进行说明,其使用和 Linux 一致,Windows 没试过,可以自行试一下,应该差不多。

在初安装完成后,conda 默认会为我们激活一个名为 base 基础环境,可以通过你的 Terminal 命令提示符判断,例如我这里就是这个样子:

(base) [zhangzhongen@zzeMac.local /Users/zhangzhongen]
$ 

我这里是修改过 PS1,所以你看到的效果可能和我这边不一致,但你只要看到你的提示符前有一个 (base) 就说明激活了默认的基础环境了。

到这里就说明你的 conda 已经安装完成并且环境已成功激活,下面就来对它的常用操作及命令进行一下说明。

切换国内源

conda 在创建虚拟环境的过程中需要下载一些包,其默认下载地址指向的服务器在国外,所以为了下载体验优质一点我们还是要将其下载源改到国内。

对 conda 来说,其下载源被其称为通道(channel),所以下载源到国内实际上也就是将其 channel 指向国内地址,以修改其 channel 指向清华源为例:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge 
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/

如果在下载包的时候希望看到包的来源 channel,则可通过下面设置显示下载包时使用的源地址:

conda config --set show_channel_urls yes

除了清华源之外还可使用中科大源,如下:

conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/

这里列出来的中科大的 channel 多几个,实际上我用的就是上面清华源 3 个 channel 其中的 2 个,目前还没有碰到不适用的情况~

执行了上述操作后,如果你使用的是 Mac OS 或 Linux,那么在当前用户的家目录下会生成一个 .condarc 文件,该文件保存了我们在上面配置的 channel 信息,如下:

(base) $ cat .condarc 
channels:
  - https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
  - https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
  - defaults
show_channel_urls: true

可以看到该文件是 YAML 格式,channels 节是一个列表,前两个元素是我添加的清华 channel,最后一个 defaults 表示是 conda 默认的 channel,当我需要下载的包在前面两个 channel 中找不到时就会去默认的 channel 查找了。

除此之外,我们还可以通过如下命令查看已添加的 channel:

(base) $ conda config --get channels
--add channels 'defaults'   # lowest priority
--add channels 'https://mirrors.ustc.edu.cn/anaconda/pkgs/free/'
--add channels 'https://mirrors.ustc.edu.cn/anaconda/pkgs/main/'   # highest priority

包管理

使用 Python 的过程中我们不可避免的要安装一些第三方包,conda 本身就内置了安装包的功能。

查看包

在安装好 conda 后其默认就自带了一些包,可以通过如下命令查看:

(base) $ conda list
# packages in environment at /Users/zhangzhongen/opt/miniconda3:
#
# Name                    Version                   Build  Channel
ca-certificates           2020.1.1                      0    defaults
certifi                   2020.4.5.1               py38_0    defaults
cffi                      1.14.0           py38hc512035_1    defaults
ncurses                   6.2                  h0a44026_1    defaults
openssl                   1.1.1g               h1de35cc_0    defaults
pip                       20.0.2                   py38_3    defaults
pycosat                   0.6.3            py38h1de35cc_1    defaults
...

安装包

当然,我们也可以手动来安装我们需要的包,以安装 Django 为例,执行下面命令即可:

# 也可通过 conda install <package_name>=<version> 的方式来安装指定版本的包。
(base) $ conda install django
Collecting package metadata (current_repodata.json): done
Solving environment: done


==> WARNING: A newer version of conda exists. <==
  current version: 4.8.3
  latest version: 4.8.4
...

conda 会检查当前虚拟环境是否合适安装指定的包,并且会解决好依赖关系。如果不合适,它也会打印出不合适的原因,通常是 Python 版本和包的版本不兼容,这时候新建一个合适的虚拟环境即可。

我们从上面 conda list 的输出结果中可以看到,默认的虚拟环境其实也是带有 pip 的,查看一下当前 pip 的所在位置:

(base) $ which pip
/Users/zhangzhongen/opt/miniconda3/bin/pip

由于虚拟环境现在是处于激活的状态,所以 conda 的环境变量覆盖了系统默认的 Python 相关环境变量,让我们此时使用的 pythonpip 等命令都是虚拟环境中的命令,所以如果要使用 pip 在虚拟环境中安装包就很简单了,和没有装 conda 的时候一样,直接用 pip install <包名> 即可,安装完成后也可通过 conda list 查看到。

pip 修改国内源可参考 https://www.zze.xyz/archives/pip-inland-repository.html

更新和移除包

更新包和卸载包就很简单啦,换俩子命令就行,如下:

# 更新指定包
conda update <package_name>
# 移除指定包
conda remove <package_name>

环境管理

激活和退出环境

至此,我们一直是在默认激活的 base 虚拟环境中操作,该环境是在我们每次创建一个新 shell 会话时默认激活的,如果不希望默认激活,执行下面命令设定即可:

# 后面如果你又希望默认激活 base 环境,依旧是下面这条命令,将 false 改为 true 即可
(base) $ conda config --set auto_activate_base false
(base) $

额,,执行完之后发现依旧是在 base 虚拟环境中,这是因为它只是控制在创建新会话时是否激活,而不是退出虚拟环境,如果希望退出当前的虚拟环境,可使用 deactivate 子命令:

(base) $ conda deactivate     
$ 

可以看到执行了该命令后命令提示符前的 (base) 就消失了,此时就说明已经成功退出 conda 的虚拟环境了。

我们也可以手动激活指定的虚拟环境,使用 activate 子命令,以激活 base 虚拟环境为例:

$ conda activate base
(base) $

创建环境

在前面的操作中,我们只接触到了默认就存在的 base 虚拟环境,当然,使用虚拟环境的我们更多时候是希望能够多套环境并存的,下面我们就来自己创建指定的虚拟环境。

首先,我们可以查看一下当前存在的环境:

(base) $ conda env list
# conda environments:
#
base                  *  /Users/zhangzhongen/opt/miniconda3
python3                  /Users/zhangzhongen/opt/miniconda3/envs/python3

conda info --envs 效果与之相同。

可以看到,就只存在一个 base 环境。

下面我们来手动创建一个名为 test 的测试环境:

(base) $ conda create -n test python=3 django=2.0
...
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate test
#
# To deactivate an active environment, use
#
#     $ conda deactivate

上述命令中,使用 -n test 指定虚拟环境名称,同时在创建的虚拟环境中安装版本号为 3python 和 版本号为 2.0django

执行完成后,我们可以按提示激活 test 虚拟环境,并检查该环境下已安装 python 和 django 查是否是我们指定的版本:

(base) $ conda activate test
# 查看已安装的包,当然也可通过 pip list 查看
(test) $ conda list
# packages in environment at /Users/zhangzhongen/opt/miniconda3/envs/test:
#
# Name                    Version                   Build  Channel
ca-certificates           2020.7.22                     0    https://mirrors.ustc.edu.cn/anaconda/pkgs/main
certifi                   2020.6.20                py37_0    https://mirrors.ustc.edu.cn/anaconda/pkgs/main
django                    2.0.5            py37hd476221_0    https://mirrors.ustc.edu.cn/anaconda/pkgs/main
python                    3.7.7                hf48f09d_4    https://mirrors.ustc.edu.cn/anaconda/pkgs/main
...

万事大吉!!是不是贼方便~~~


除了通过上述的命令行方式创建虚拟环境外,我们还可以为要创建的虚拟环境整一个配置文件,该文件可以描述虚拟环境的名称、依赖包等信息。

以创建一个名为 dev 的虚拟环境为例,假设该虚拟环境依赖于 psutildjango3,我们可以创建如下名为 dev.yaml 的配置文件:

name: dev
# 此处 channels 段可以省略,因为我们已经配置了默认的 channel
channels:
  - https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
  - https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
  - defaults
# 依赖包
dependencies:
  - psutil
  - django==2.0.5

如果不希望安装任何包,可以在该文件中只指定一个 name 属性。

然后执行如下命令指定该配置文件即可创建对应配置文件描述的环境:

(test) $ conda env create -f dev.yaml

除了使用 YAML 格式的配置文件,我们还可以使用 pip 包文件格式的配置文件。

创建一个 requirements.txt 内容如下:

pip==10.0.1
numpy==1.15.4
pandas==0.23.4
matplotlib==2.2.3

由于该文件没有虚拟环境的名称、及使用 Python 版本信息,所以在使用此种配置文件我们需要在命令行手动指定虚拟环境名称和依赖的 Python 版本,如下:

(test) $ conda env create -f=requirements.txt -n deepleran  python==3.7

再补充最后一个创建虚拟环境的方法,依旧是使用 create 子命令,该子命令提供了一个 --clone 选项,即基于一个已存在的环境克隆出一个新环境,其使用格式如下:

# new_env_name:新环境名称 old_env_name:被克隆的环境名称
conda create -n <new_env_name> --clone <old_env_name> 

这个很简单,就不演示啦。。

至此,使用 conda 创建虚拟环境的几种方式就介绍完啦~~

重命名和删除环境

实际上 conda 并没有直接提供重命名环境的命令,但我们可以通过上面创建环境中的克隆操作曲线救国。。

以修改 dev 虚拟环境的名称为 develope 为例,先基于 dev 虚拟环境克隆出 develope 环境:

(test) $ conda create -n develope --clone dev

然后删除原来的 dev 虚拟环境:

(test) $ conda env remove dev 

到这里,conda 的常用操作就全部介绍完啦~~~日常使用肯定是妥妥的,洗洗睡去。。😆

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/conda-usage.html

Buy me a cup of coffee ☕.