“ 大家好哇!我们在前面介绍如何为python部署第三方包时提到,推荐优先使用conda命令进行安装。那么在今天呢,我们就来聊一聊为什么更推荐使用conda而不是pip命令。”
1
conda 和pip简介
在很多时候,由于conda和pip两个命令的某些功能存在重叠(比如可以用来安装第三方包),所以很多人认为他们是一样的。但其实两者最初被设计的目的并不相同。Pip是Python Packaging Authority(PyPA,是一个工作组,负责维护 python包中使用的一系列核心软件)推荐用来从Python Package Index(PyPI,是由PyPA开发的python包构成的索引包)下载第三方包的工具。Pip可以用来下载和安装.whl和源码格式的包,其中用pip进行源码安装可能会要求系统中已经成功安装了兼容的编译器以及必要的包。
而conda 则是一个跨平台的包和环境管理器,用于从Anaconda和Anaconda Cloud中安装和管理conda包。因为conda 包是二进制文件,所以我们不需要编译器来对它们进行编译,这是一个与pip不同的地方。此外,conda 包并不仅限于 安装Python软件,还可以借助conda来安装包含 C 或 C 包、R 包在内的任何其他软件。
2
conda和pip的主要区别
Conda和pip虽然在某些功能上重叠,但两者也存在着许多不同,各有各的优缺点,详细可以见下表。
conda | pip | |
---|---|---|
包内容 | 二进制 | .whl和源码 |
是否需要编译 | 不需要 | 需要 |
安装包类型 | Python、C、R等任何类型 | 仅限于Python |
是否支持环境管理 | 是,可以创建多个环境 | 否,需要借助virtualenv or venv等其它工具 |
依赖包检查 | 检查十分严格 | 检查不严格 |
包来源 | Anaconda repo and cloud | PyPI |
包数量 | 约1500个 | 约150000个 |
3
Conda的优势
在了解了conda和pip的基本概念之后,我们结合上表来具体谈谈为何推荐优先使用conda啦。首先,相比于pip只能安装Python包来说,conda可以安装用任何语言编写的软件包。这一优点带来的好处是巨大的,完全可以利用这一特性部署一个私有的个人环境。比如我在编译wrf时,除了服务器已经配置好的一些库以外,可能还缺少如libpng、zlib等库,这时便可以借助conda进行安装,十分方便。
其次在使用pip安装包之前必须先通过其他方式安装好python解释器,而conda则可以直接安装python解释器以及python软件包。
此外,conda还是一个超越python的内置环境管理工具,可以创建多个环境并使其相互隔离开,避免各个软件之间出现版本不兼容的现象。这在使用数据科学相关的工具时会非常有用,因为不同的处理工具可能包含相互冲突的需求,但使用conda的话可以避免将这些工具全部安装在一个环境中,比如可以在一个环境中安装python2.7版本的解释器,在另一个环境中安装Python3.7版本的解释器。而pip则不包含这样的内置环境管理工具,而是依赖于外部的其他工具,如virtualenv 或 venv来创建隔离的环境。
最后,由于conda对于环境中依赖关系的检查非常严格,所以基本上只要conda能安装上,软件包就能使用,但如果是使用pip的话,可能某些时候尽管显示你已成功安装,但由于包与包之间的依赖关系不满足,软件包会出现无法使用的情况。这主要是由于在安装软件包时,pip会在递归的串行循环中安装依赖项,并不能确保所有包的依赖关系同时满足。比如说若在安装顺序中较早安装的软件包与较晚安装的软件包具有不兼容的依赖项版本,就可能会导致环境错误,即使安装上也无法正常使用。而conda则会使用可满足性求解器(SAT)来验证是否满足环境中安装的所有软件包的全部要求。虽然这个检查可能需要一些额外的时间,但有利于防止出现上面环境不满足的现象。
以上就是推荐优先使用conda命令进行安装第三方库的全部原因了。虽然conda已经包含了数据科学、机器学习等领域的许多包了,但相对于PyPI上提供的超过150000个包相比,显得依然很小。所以当你想要的包在conda上没有的话,那就结合pip一起使用吧!
参考:
https://www.anaconda.com/blog/understanding-conda-and-pip