前言

Conda是一个强大的包和环境管理工具。

本文根据conda-getting-started编译而成,喜欢阅读英文的伙伴们可以直接去读英文说明。

conda命令的一些选项开关有两种指定方式,一种两个连接号“—”后跟选项名全程,一种是一个连接号“-”后跟简称。比如说”-n”和”—name”是等价的。但是要注意有些例外,比如说,“—version”对应的是“-V”(大写的V而不是小写的v)。

管理conda本身

管理conda版本

1
2
3
conda --version
conda info
conda -V

查看conda的配置

1
conda config --show # 查看channel等

管理conda自身.png

管理channel

(设置国内镜像的话可以使安装更快捷一些。)

  1. 从最高到最低通道优先级对包进行排序。
  2. 将捆绑的包—-具有相同通道优先级的包—-从最高到排序到最低版本号。

顺序是: channelA::numpy-1.13_1 > channelA::numpy-1.12.1_1 > channelA::numpy-1.12.1_0 > channelB::numpy-1.13_1

1
2
3
4
5
6
7
8
9
10
11
12
13
#设置清华镜像
# add是添加顶部频道,append是将通道添加到频道列表底部,最低优先级
conda config --add channels new_channel
conda config --append channels new_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/pkgs/main/
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/bioconda/
#设置bioconda
conda config --add channels bioconda
conda config --add channels conda-forge
#设置搜索时显示通道地址
conda config --set show_channel_urls yes

channels.png

官方的channel:
defaults.png

在国内使用 conda 镜像的时候最好手动删除一下~/.condarc 里的 defaults 频道。你可以直接打开~/.condarc 手动删除掉defaults这一行或者运行下面这句命令即可。

1
2
sed '/defaults/d' ~/.condarc # linux
# windows中直接打开文件删除就行

conda在没有指定频道的前提下是从~/.condarc文件里从上往下一个频道一个频道去找软件的。所以如果把常用的频道放在最上面有利于更快地找到所需要安装的软件。.condarc文件内容如下:

1
2
3
4
5
6
7
8
9
channels:
- conda-forge
- bioconda
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults # 可删除提高速度
show_channel_urls: true

conda-forge上的安装包比default的更加新、更加全,请优先使用。

移除channel

1
conda config --remove channels conda-forge

查询当前配置中包含哪些channels
1
conda config --get channels

channel-config.png

更新版本

1
2
3
4
5
6
7
8
conda update conda
conda update -n base -c conda-forge conda # 这个不太行,感觉是隧道的问题
conda update -n base -c defaults conda
# 更新失败使用如下
# The inability to update is because of the shortened current_repodata.json file that is being used to resolve dependencies. Pointing it at repodata.json instead provides a bigger, more accurate search space for the dependency solver that enables conda to be updated.
# 个人感觉是conda-forge这些channel的问题,下面的命令使用defaults就可行。
conda update -n base -c defaults conda --repodata-fn=repodata.json
conda update --all --yes # 这些命令多试试,这个太难成功了

更新Anaconda整体

将整个Anaconda都更新到确保稳定性和兼容性的最新版本

1
conda update Anaconda

有时会出现”custom”字样。这意味着你使用了定制的Anaconda发行版,而非官方发布的版本。(一般没事)

查看某个命令的帮助

1
conda create --help

管理环境

Conda可以创建相互隔离的独立环境,这些环境被称之为虚拟环境。

(Virtual Environment),这些环境各自包含属于自己的文件、包以及他们的依存关系,并且不会相互干扰。

Anaconda有一个缺省的名为base的环境。但是不建议把程序放在base环境中,应该创建不同的虚拟环境分别管理不同的开发项目。

创建虚拟环境

1
conda create -n env_name

这表示创建python版本为3.8、名字为env_name的虚拟环境。

创建后,env_name文件可以在Anaconda安装目录envs(不止一个,conda info查看)文件下找到。在不指定python版本时,自动创建基于最新python版本的虚拟环境.

创建虚拟环境的同时安装必要的包

1
conda create -n env_name numpy matplotlib scipy=0.17.3 python=3.8

创建环境.png

从 environment.yml 文件创建环境

1
conda env create -f environment.yml

文件的第一行设置新环境的名字。有关详细信息,请参阅手动创建环境文件

查看有哪些虚拟环境

1
2
3
conda env list
conda info -e
conda info --envs

查看环境.png

查看环境1.png

星号的位置表示我现在在base环境下工作。命令行的最左端括号中也是ENV_NAME的名称。

激活虚拟环境

想要进入某个已创建好的环境下,需要先将其激活,命令是

1
conda activate env_name

此时使用python —version可以检查当前python版本是否为所想要的(即虚拟环境的python版本)。

activate.png

退出虚拟环境

1
2
conda activate
conda deactivate

以上两条命令只中任一条都会让你回到base environment,它们从不同的角度出发到达了同一个目的地。可以这样理解,activate的缺省值是base,deactivate的缺省值是当前环境,因此它们最终的结果都是回到base

克隆环境

1
conda create --name myclone --clone myenv

删除虚拟环境

将该指定虚拟环境及其中所安装的包(是整个虚拟环境的目录没有了,所以pip和conda安装的包都没有了)都删除。

1
2
conda remove --name env_name --all
conda env remove --name myenv

removeenv.png

如果只删除虚拟环境中的某个或者某些包则是:

1
conda remove --name env_name package_name

还原环境

Conda 保留对环境所做的所有更改的历史记录, 因此,您可以轻松地“回滚”到以前的版本。列出对当前环境的每次更改的历史记录:

1
conda list --revisions

要将环境恢复到以前的修订版本:
1
2
3
conda install --revision=REVNUM
conda install --rev REVNUM
conda install --rev 8 # 例

revisions.png

导出环境

很多的软件依赖特定的环境,我们可以导出环境,这样方便自己在需要时恢复环境,也可以提供给别人用于创建完全相同的环境。

1
2
3
4
5
6
#获得环境中的所有配置
conda env export > environment.yml
#
conda env export --name myenv > myenv.yml
#重新还原环境
conda env create -f myenv.yml

exportenv.png

环境包管理

在base环境中安装,请切换成管理员启动Prompt,不然权限不够。

查询包的安装情况

查询看当前环境中安装了哪些包

1
2
conda list
conda list package_name # 查找包含package_name的包

查询当前Anaconda repository中是否有你想要安装的包
1
conda search package_name

当然与互联网的连接是执行这个查询操作乃至后续安装的前提条件.

包的安装和更新

在当前(虚拟)环境中安装一个包:

1
2
conda install package_name
conda install numpy=0.20.3

安装完一个包后可以执行conda list确认现在列表中是否已经包含了新安装的包。

安装包的时候可以指定从哪个channel进行安装,比如说,以下命令表示不是从缺省通道,而是从conda_forge安装某个包。

1
conda install pkg_name -c conda_forge --name myenv

可以用以下命令将某个包更新到它的最新版本:

1
conda update numpy

卸载包

1
2
conda uninstall package_name
conda remove -n myenv scipy # 作用相同

这样会将依赖于这个包的所有其它包也同时卸载。

如果不想删除依赖其当前要删除的包的其他包:

1
conda uninstall package_name --force

但是并不建议用这种方式卸载,因为这样会使得你的环境支离破碎,如以下(conda manual description原文)所述:

一个直观的理解就是,如果一个包A被删除了,而依赖于它的包B、C等却没有删除,但是那些包其实也已经不可用了。另一方面,之后你又安装了A的新版本,而不幸的是,B、C却与新版本的A不兼容因此依然是不可用的。

清理anaconda缓存

1
2
3
conda clean -p      # 删除没有用的包 --packages
conda clean -t # 删除tar打包 --tarballs
conda clean -y -all # 删除所有的安装包及cache(索引缓存、锁定文件、未使用过的包和tar包)

conda就像个守财奴一样,把每个历史安装包都会好好保存。好处是可以很方便地恢复到旧的历史版本,坏处是占内存空间。前两天由于安装一个新的包,系统报告“CondaMemoryError: The conda process ran out of memory. Increase system memory and/or try again.”,执行”conda clean -y -all”清除了约30G的空间!

Python版本的管理

除了上面在创建虚环境时可以指定python版本外,Anaconda基环境的python版本也可以根据需要进行更改。

将版本变更到指定版本

1
conda install python=3.5

将python版本更新到最新版本

1
conda update python

conda && pip

区别

  1. conda可以管理非python包,pip只能管理python包。
  2. conda自己可以用来创建环境,pip不能,需要依赖virtualenv之类的。
  3. conda安装的包是编译好的二进制文件,安装包文件过程中会自动安装依赖包;pip安装的包是wheel或源码,装过程中不会去支持python语言之外的依赖项。
  4. conda安装的包会统一下载到一个目录文件中,当环境B需要下载的包,之前其他环境安装过,就只需要把之间下载的文件复制到环境B中,下载一次多次安装。pip是直接下载到对应环境中。
  5. conda只能在conda管理的环境中使用,例如比如conda所创建的虚环境中使用。pip可以在任何环境中使用,在conda创建的环境 中使用pip命令,需要先安装pip(conda install pip ),然后可以 环境A 中使用pip 。conda 安装的包,pip可以卸载,但不能卸载依赖包,pip安装的包,只能用pip卸载。
  6. pip和conda在安装软件包时,在依赖关系方面的处理机制不同。pip在递归的串行循环中安装依赖项,不会确保同时满足所有软件包的依赖关系,如果按顺序较早安装的软件包相对于按顺序较晚安装的软件包具有不兼容的依赖项版本,则可能导致环境以微妙的方式被破坏掉;conda使用SAT(satisfiability)solver来验证是否满足环境中安装的所有软件包的所有要求,只要有关依赖项的软件包元数据正确,conda就会按预期产生可用的环境。

能否混用

首先,不建议混用。混用容易导致库的依赖关系出现混乱,然后突然哪天环境可能就崩了,安装不了新的包,无法进行conda update之类的。

其次,由于conda的库确实不如pip的库丰富{很多包只在 pip 有:PYPI有15万可用包,而Anaconda repository中(使用conda命令安装)提供了1,500多个软件包,Anaconda cloud上(使用conda-forge或bioconda命令安装)的几千种其他软件包。},所以有时候可能迫不得已要使用pip安装。切记,只有在conda install搞不定时才使用pip intall。 而且,最后使用虚拟环境进行环境隔离。

并且conda无法删除pip安装的包。

安装在哪里

  • conda install xxx:这种方式安装的库都会放在anaconda3/pkgs目录下,这样的好处就是,当在某个环境下已经下载好了某个库,再在另一个环境中还需要这个库时,就可以直接从pkgs目录下将该库复制至新环境而不用重复下载。

conda-package-site.png

  • pip install xxx:分两种情况,
  1. 一种情况就是当前conda环境的python是conda安装的,和系统的不一样,那么xxx会被安装到.conda/envs/current_env/lib/python3.x/site-packages文件夹中。其中如果是base环境,则是下方的路径

base-pip.png

如果不是base环境,conda虚拟环境pip安装地址如下(每个虚拟环境都会有一个单独的pip地址)

虚拟环境pip地址.png

  1. 如果当前conda环境用的是系统的python,那么xxx会通常会被安装到~/.local/lib/python3.x/site-packages文件夹中

如何判断conda中某个包是通过conda还是pip安装的?

执行conda list ,用pip安装的包显示的build项目为pypi。如下图所示:

pip标致.png

注:base环境中无法看到pip安装的包

conda configuration

conda的配置文件为”.condarc”,该文件在安装时不是缺省存在的。但是当你第一次运行conda config命令时它就被自动创建了。”.condarc”配置文件遵循简单的YAML语法。

1
C:\Users\用户名\.condarc

执行conda info,会有信息显示如下所示:

condarc文件.png