Anaconda与conda、pip与conda的区别 - 搬运
阅读原文时间:2023年07月08日阅读:1

Anaconda与conda、pip与conda的区别

风影忍着

转自:https://zhuanlan.zhihu.com/p/379321816

作为一个Python初学者,在请教资深Python用户怎么入门的时候,是不是总是被推荐“你去下载一个Anaconda就行”?

在下载Package的时候,到底是要用pip还是conda?它俩到底是什么关系,有什么区别?

本文就将分析一下,Anaconda与conda、pip与conda的区别。

Conda发行于2012年,是一个开源的、跨平台的包和环境管理工具。

尽管Conda被打包在了Anaconda中,这两个是有着不同目标的不同事物。

Conda和Anaconda经常会被混淆,可能是因为Conda被紧密地打包进了Anaconda和Miniconda中。

Anaconda是一个软件发行版。软件发行版是一个预先建立和配置好的packages的集合,可以被安装在操作系统上,并被使用。Anaconda是由Anaconda公司开发的,一个包含PyData生态中的核心软件的完全发行版,它包含了Python本身和数百个第三方开源项目的二进制文件,例如conda、numpy、scipy、ipython等。

Miniconda也是一个软件发行版。Miniconda本质上是一个用来安装空的conda环境的安装器,它仅包含Conda和Conda的依赖,而不包含上一段中列举的包。所以我们可以从零开始,安装我们需要的东西。当然,我们也可以通过conda intall anaconda来将anaconda安装到其中。

Conda是一个包和环境管理工具。包管理工具是一个用来自动化安装、升级、删除packages的工具。由于Conda拥有“conda install“、”conda update“、”conda remove“等子命令,它完全符合包管理工具的定义。

注意:如果你愿意,我们可以完全独立地、在没有Anaconda和Miniconda的情况下安装Conda。

Conda是一个与语言无关的跨平台包和环境管理器。虽然conda发源于Python的PyData社区,但是它不仅适用于管理Python包,而且还是一个通用的包管理工具。用conda可以创建、管理任何类型的、用任何语言写的包和依赖。它很像一个跨平台版本的apt或者yum。

Conda只能在conda环境中安装包,但是可以安装各种语言、各种类型的包。

所以说,如果我们希望在一个已有的系统Python环境中安装Python包,conda是帮不了我们的,因为它只能在conda环境中安装包。

Pip是Python包的通用管理器。pip的全称是Pip Install Packages,它是一个Python官方认证的包管理工具。它只能管理python包,通常用于安装发布在Python Package Index(PyPI)上面的包。Pip和PyPI均由Python Packaging Authority(PyPA)管理和支持。

Pip可以在任何环境中安装包,但是只能安装Python包。

所以说,如果我们需要用到很多依赖于外部dependencies的Python包(例如NumPy、SciPy和Matplotlib),或者如果我们想要跟踪这些包的外部依赖,那么pip是帮不了我们的,因为它只能管理Python包。

如果我们要做的仅仅是在相互独立的环境中安装Python包,那么conda的作用和pip+virtualenv的作用几乎是一样的。其中“相互独立的环境”指的是conda环境或者是virtualenv,在这样的环境中,我们可以在不修改系统Python安装的前提下安装各种包。

下面是conda和pip的特性对比:

 

conda

pip

管理

二进制

wheel或源码

需要编译器

No

Yes

语言

Any

Python

虚拟环境

支持

通过virtualenv或venv等支持

依赖性检查

Yes

屏幕提示用户选择

包来源

Anaconda repo和Cloud

PyPI

前面说到,如果我们要做的仅仅是在相互独立的环境中安装Python包,那么conda的作用和pip+virtualenv的作用几乎是一样的。

但是两者仍然有一些区别。

首先,在conda环境下,我们可以管理不同版本的Python,包括安装和升级Python本身。但是virtualenvs必须基于一个已经存在的、有外部管理的Python可执行文件。virtualenv能实现的只是不同环境下的python包互相独立,但是不同环境下用的python是同一个版本。

其次,conda可以跟踪非Python的依赖,例如无缝地管理依赖关系,或者是基本工具(如LAPACK或OpenSSL)的并行版本。

再次,conda环境是放在一个可执行路径中的真正独立的环境。virtualenv的环境是建立于符号链接(symlinks)的环境,这种环境打破了virtualenv的独立性,有时候对于非python的dependencies来说是很脆弱的。

最后,我们可以运行conda install pip,然后我们就可以在conda环境中用pip install来安装python包了。不过,我们最好不要再virtualenv里面装conda,否课可能出现一些奇怪的问题。

Conda与Anaconda公司没有依赖或者是捆绑的关系。它是100%开源的,它被托管在GitHub上,使用BSD-License。但是,conda的默认channel不是完全开源的,大概还有几十个包没有开源。

Anaconda公司的一个重要服务是对于build artifacts提供免费的托管服务,不过如果对于Anaconda未来会收费有担心,我们也不是一定要用Anaconda的托管服务。

目前有一个2016年发起的、由社区赞助、由社区主导的工作,即Conda-Forge。它使得conda的打包和分发完全开源。所有的包被托管再Github上,同时使用免费的CI工具(例如Mac上的Travis CI,Windows上的AppVeyor,Linux上的CircleCI)来自动创建二进制文件。每一个包的所有的metadata储存再Github仓库上,并且包的升级通过merge GitHub的pull request来完成。

Conda-Forge也会把它的包发布到https://anaconda.org/上。

值得一提的是,conda包是由营利性公司Anaconda公司托管的。同样的,Python Package Index是由营利性公司Packspace公司托管的。