pip和conda有什么区别?

我知道pip是python包的包管理器。然而,我看到IPython网站上的安装使用conda来安装IPython。

我可以使用pip安装IPython吗?当我已经有pip时,为什么要使用conda作为另一个python包管理器?

pipconda有什么区别?

476732 次浏览

引用conda博客

涉足python领域这么久,我们都知道有pip、easy_install和Virtualenv,但是这些工具并不能满足我们所有的特定需求。主要问题是它们围绕Python集中,忽视了非Python库的依赖,例如HDF5、MKL、LLVM等。它们的源代码中没有setup.py,也不会将文件安装到Python的site-包目录中。

所以Conda是一个打包工具和安装程序,旨在做比pip更多的事情;处理Python包的库依赖项外面以及Python包本身。Conda还创建了一个虚拟环境,就像virtualenv一样。

因此,Conda应该与建筑进行比较,这是另一个可以让您处理Python和非Python安装任务的工具。

因为Conda引入了一种新的打包格式,所以您不能互换使用pip和Conda;pip不能安装Conda包格式。您可以同时使用这两个工具(通过安装pipconda install pip),但它们也不能互操作。

自从写下这个答案以来,Anaconda发布了一个了解康达和皮普,它也呼应了这一点:

这突出了conda和pip之间的一个关键区别。pip安装Python包,而conda安装可能包含以任何语言编写的软件的包。例如,在使用pip之前,必须通过系统包管理器或下载并运行安装程序安装Python解释器。另一方面,Conda可以直接安装Python软件包和Python解释器。

并进一步

有时需要一个包,它不能作为conda包使用,但可以在PyPI上使用,并且可以使用pip安装。在这种情况下,尝试同时使用conda和pip是有意义的。

免责声明:这个答案描述了十年前的情况,当时pip不支持二进制包。Conda是专门为更好地支持构建和分发二进制包而创建的,特别是带有C扩展的数据科学库。作为参考,pip仅获得了对带轮子的可移植二进制包(2013年的pip 1.4)和manylinux1规范(2016年3月的pip 8.1)的广泛支持。有关更多历史,请参阅最近的答案

以下是一个简短的概要:

pip

  • 仅限Python包。
  • 从源代码编译所有内容。编辑:pip现在安装二进制轮子,如果它们可用。
  • 由核心Python社区祝福(即,Python 3.4+包含自动引导pip的代码)。

conda

  • 与Python无关。现有包的主要焦点是Python,实际上Conda本身是用Python编写的,但您也可以拥有用于C库、R包或其他任何东西的Conda包。
  • 安装二进制文件。有一个名为conda build的工具可以从源代码构建包,但conda install本身会从已经构建的Conda包中安装东西。
  • 外部。conda是一个环境和包管理器。它包含在由连续分析公司(现在称为Anaconda, Inc.)提供的Anaconda Python发行版中。

conda在Anaconda之外独立开发和支持。conda-forge基础设施完全独立于Anaconda, Inc.。Anaconda, Inc.是conda包开源社区中庞大的维护者团队之一。

conda是一个用Python编写的环境管理器,与语言无关。conda环境管理功能涵盖了venv、Virtualenv、Pipenv、Pyenv和其他特定于Python的包管理器提供的功能。你可以通过pip安装在现有的Python安装中使用conda(尽管除非你有充分的理由使用现有安装,否则不建议这样做)。截至2022年,conda和pip还没有完全了解虚拟环境中的彼此包管理活动,也不能为Python包管理互操作。

在这两种情况下:

  • 用Python编写
  • 开源(conda是BSD,pip是MIT)

conda的前两个要点确实使它在许多包中优于pip。由于pip从源代码安装,如果您无法编译源代码,使用它安装东西可能会很痛苦(在Windows上尤其如此,但如果包有一些困难的C或FORTRAN库依赖项,甚至在Linux上也是如此)。conda从二进制安装,这意味着有人(例如,连续体)已经完成了编译包的艰苦工作,因此安装很容易。

如果您对构建自己的包感兴趣,也有一些差异。例如,pip构建在setupols之上,而conda使用自己的格式,这有一些优势(例如静态,再次,Python不可知)。

其他答案对细节进行了公平的描述,但我想强调一些高层次的观点。

pip是一个软件包管理器,可促进python包的安装、升级和卸载。它也适用于虚拟python环境。

conda是任何软件(安装、升级和卸载)的包管理器。它也适用于虚拟系统环境。

conda设计的目标之一是方便用户所需的整个软件栈的包管理,其中一个或多个python版本可能只是一小部分。这包括低级库,如线性代数、编译器,如Windows上的ming w、编辑器、版本控制工具,如Hg和Git,或任何需要分配和管理的东西

对于版本管理,pip允许您在多个python环境之间切换和管理。

Conda允许您在多通用环境之间切换和管理,其中多个其他东西的版本号可能会有所不同,例如C库、编译器、测试套件或数据库引擎等。

Conda不是以Windows为中心的,但在Windows上,当需要安装和管理需要编译的复杂科学软件包时,它是目前可用的高级解决方案。

当我想到我在Windows上尝试通过pip编译许多这些包时浪费了多少时间,或者在需要编译时调试失败的pip install会话时,我想哭泣。

最后一点,连续分析还托管(免费)binstar.org(现在称为anaconda.org),允许常规软件包开发人员创建自己的自定义(构建!)软件堆栈,他们的包用户将能够从中conda install

不想让你迷惑,但是您也可以在conda环境中使用pip,它验证了上面的一般与python特定管理器评论。

conda install -n testenv pipsource activate testenvpip <pip command>

您还可以将pip添加到任何环境的默认包中,以便每次都出现它,这样您就不必遵循上述片段。

对于WINDOWS用户

“标准”包装工具的情况最近正在改善:

  • 在pypi上,截至2015年9月11日,现在有48%的车轮套件(高于2015年5月的38%,2014年9月的24%),

  • 轮格式现在支持开箱即用的最新python 2.7.9,

“标准”+“调整”包装工具的情况也在改善:

“Conda”包装对于它所服务的市场来说仍然更好,并突出了“标准”应该改进的领域。

(此外,在标准轮子系统和conda系统中的依赖规范多重努力,或构建,不是很Pythonic,如果所有这些打包“核心”技术都可以通过某种PEP融合,那就太好了)

引用Conda数据科学文章到连续体的网站:

conda vs pip

Python程序员可能熟悉pip从PyPI下载包并管理他们的需求。虽然conda和pip都是包管理器,但它们非常不同:

  • Pip特定于Python包,conda与语言无关,这意味着我们可以使用conda来管理任何语言的包pip从源代码编译,conda安装二进制文件,消除了编译的负担
  • Conda本地创建与语言无关的环境,而pip依赖于虚拟环境来管理Python环境虽然建议始终使用conda包,但conda也包含pip,因此您不必在两者之间做出选择。例如,要安装没有conda包但可以通过pip获得的python包,只需运行,例如:
conda install pippip install gensim

引用康达:神话与误解(全面描述):

误区3:Conda和pip是直接竞争对手

现实:Conda和pip服务于不同的目的,并且只在一小部分任务中直接竞争:即在隔离环境中安装Python包。

Pip,代表Pipn的意思Packages,是Python官方认可的包管理器,最常用于安装发布在Python包索引(PyPI)上的包。pip和PyPI都由Python包装管理局(PyPA)管理和支持。

简而言之,pip是Python包的通用管理器;conda是一个与语言无关的跨平台环境管理器。对于用户来说,最突出的区别可能是这样的:pip在任何环境中安装python包;conda在conda环境中安装任何包。如果你所做的只是在隔离环境中安装Python包,conda和pip+虚拟alenv大部分是可以互换的,只是在依赖处理和包可用性方面有所不同。我所说的隔离环境是conda-env或虚拟alenv,你可以在其中安装包而无需修改系统Python安装。

抛开误区2不谈,如果我们只关注Python包的安装,conda和pip服务于不同的受众和不同的目的。如果你想,比如说,管理现有系统Python安装中的Python包,conda帮不了你:根据设计,它只能在conda环境中安装包。如果你想,比如说,使用许多依赖于外部依赖项的Python包(NumPy、SciPy和Matplotlib是常见的例子),同时以有意义的方式跟踪这些依赖项,pip帮不了你:根据设计,它管理Python包,并且只管理Python包。

Conda和pip不是竞争对手,而是专注于不同用户群体和使用模式的工具。

我可以使用pip安装iPython吗?

当然,两者都有(第1页)

pip install ipython

和(第三种方法,第二种是conda

您可以从GitHub或PyPI手动下载IPython。要安装一个在这些版本中,解压它并从顶级运行以下内容使用终端的源目录:

pip install .

官方推荐的安装方式

当我已经有pip时,为什么要使用conda作为另一个python包管理器?

这里所示:

如果你需要一个特定的包,也许只有一个项目,或者如果你需要与其他人共享项目,conda似乎更合适。

Conda超过pip(YMMV

  • 使用非python工具的项目
  • 与同事分享
  • 版本间切换
  • 在具有不同库版本的项目之间切换

pip和conda有什么区别?

其他人对此都有广泛的回答。

pip仅适用于Python

conda仅适用于Anaconda+其他科学包,如R依赖项等。不是每个人都需要Python附带的Anaconda。Anaconda主要适用于那些做机器学习/深度学习等的人。休闲Python开发人员不会在他的笔记本电脑上运行Anaconda。

我可能发现了另一个细微的区别。我的python环境在/usr下,而不是/home或其他什么。为了安装它,我必须使用sudo install pip。对我来说,sudo install pip的不良副作用与其他地方广泛报道的略有不同:这样做之后,我必须运行pythonsudo才能导入任何sudo安装的包。我放弃了这一点,最终发现我可以使用sudo conda将包安装到/usr下的环境中,然后正常导入,而不需要sudopython的许可。我甚至使用sudo conda来修复损坏的/home2,而不是使用/home3或/home4。

pip是一个包管理器。

conda既是包管理器又是环境管理器。

详情:

输入图片描述

依赖项检测

pip和conda在环境中依赖关系的实现方式也不同。安装包时,pip以递归的串行循环安装依赖项。没有努力确保所有包的依赖项同时满足。如果在订单中较早安装的包相对于在订单中较晚安装的包具有不兼容的依赖版本,这可能导致环境以微妙的方式被破坏。相比之下,conda使用可满足性(SAT)求解器来验证是否满足环境中安装的所有包的所有要求。此检查可能需要额外的时间,但有助于防止破坏环境的创建。只要有关依赖项的包元数据是正确的,conda将可预测地生成工作环境。

参考文献

要回答最初的问题,
对于安装包,PIP和Conda是完成同样的事情的不同方法。两者都是安装包的标准应用程序。主要区别在于包文件的来源。

  • PIP/PyPI将有更多的“实验”包,或者更新的、不太常见的包版本
  • Conda通常会有更完善的包或版本

一个重要的警示:如果您同时使用两个源(pip和conda)在同一环境中安装软件包,这可能会在以后导致问题。

  • 重建环境会更困难
  • 修复包不兼容变得更加复杂

最佳做法是选择一个应用程序PIP或Conda来安装软件包,并使用该应用程序安装您需要的任何软件包。但是,有许多例外或原因仍然在conda环境中使用pip,反之亦然。例如:

  • 当您需要的包只存在于一个包上时,并且其他没有他们。
  • 你需要一个只在一个环境中可用的特定版本

(2021更新)

太长别读使用pip,它是自Python 3以来的官方包管理器。

pip

  • 基础

  • pip是python的默认包管理器

  • pip是从Python 3.0开始内置的

  • 用法:python3 -m venv myenv; source myenv/bin/activate; python3 -m pip install requests

  • 包从pypi.org下载,官方公共python存储库

  • 它可以在可用时安装预编译的二进制文件(轮子)或源(tar/zip存档)。

  • 编译的二进制文件很重要,因为许多包混合了Python/C/其他与第三方依赖项和复杂的构建链。它们必须作为二进制文件分发才能随时可用。

  • 先进

  • pip实际上可以从任何存档、轮子或git/svn存储库安装…

  • …可以位于磁盘、HTTP URL或个人pypi服务器上。

  • pip install git+https://github.com/psf/requests.git@v2.25.0例如(它可以用于测试分支上的补丁)。

  • pip install https://download.pytorch.org/whl/cpu/torch-1.9.0%2Bcpu-cp39-cp39-linux_x86_64.whl(该轮是Linux上的Python 3.9)。

  • 从源代码安装时,pip会自动构建包。(这并不总是可能的,尝试在没有谷歌构建系统的情况下构建TensorFlow:D)

  • 二进制轮子可以是python版本特定的和操作系统特定的,请参阅manylinux规范以最大限度地提高可移植性。

conda

  • 您不得将Anaconda或来自Anaconda存储库的软件包用于商业用途,除非您获得许可证。

  • Conda是来自conda的第三方包管理器。

  • 它由蟒蛇推广,这是一个Python发行版,包括最常见的即用型数据科学库。

  • 当您使用anaconda时,您将使用conda。

  • 包从anaconda repo下载。

  • 它只安装预编译的包。

  • Conda有自己的包格式。它不使用轮子。

  • conda install安装一个包。

  • conda build构建一个包。

  • conda可以构建python解释器(以及它所依赖的其他C包)。这就是为anaconda构建和捆绑解释器的方式。

  • conda允许安装和升级Python解释器(pip不允许)。

  • 先进

  • 从历史上看,conda的卖点是支持构建和安装二进制包,因为pip并没有很好地支持二进制包(直到车轮和manylinux2010规范)。

  • 强调构建包。Conda具有广泛的构建设置并存储广泛的元数据,以处理依赖项和构建链。

  • 一些项目使用conda来启动复杂的构建系统并生成一个轮子,该轮子发布到pip的pypi.org。

easy_install/鸡蛋

  • 仅供历史参考。请勿使用
  • 鸡蛋是一种废弃的包装格式,它被使用到2010年代中期和完全被轮子取代
  • 鸡蛋是一个zip存档,它包含python源文件和/或编译库。
  • 鸡蛋与easy_install和pip的第一个版本一起使用。
  • easy_install是另一个包管理器,在pip和conda之前。它在setupols v58.3(2021年)中被删除。
  • 它也引起了很多混乱,就像pip vs conda: D
  • Eg文件加载缓慢,指定不当,并且特定于操作系统。
  • 每个蛋都设置在一个单独的目录中,import mypackage必须在可能的数百个目录中查找mypackage.py(安装了多少库?)。这很慢,对文件系统缓存不友好。

从历史上看,上述三个工具都是开源的,是用Python编写的。然而,conda背后的公司在2020年更新了他们的用户使用条款,禁止商业使用,小心!

Fun事实:构建Python解释器唯一严格要求的依赖项是zlib(一个zip库),因为压缩是加载更多包所必需的。鸡蛋和轮子包是zip文件。

为什么有这么多选择?

问得好。

让我们深入研究Python和计算机的历史。=D

纯python包在这些打包器中一直运行良好。问题是不仅仅是Python包。

世界上大多数代码都依赖于C语言,这对于Python解释器来说是如此,这是用C语言编写的,对于许多Python包来说也是如此,这些包是围绕C库或混合python/C/C++代码的项目的python包装器。

任何涉及SSL、压缩、GUI(X11和Windows子系统)、数学库、GPU、CUDA等的东西……通常都与一些C代码相结合。

这给打包和分发Python库带来了麻烦,因为它不仅仅是可以在任何地方运行的Python代码。必须编译库,编译需要编译器和系统库以及第三方库,然后一旦编译,生成的二进制代码仅适用于编译它的特定系统和python版本。

最初,python可以很好地分发纯python库,但对分发二进制库的支持很少。在2010年左右,你会遇到很多错误,试图使用numpycassandra。它下载了源代码并无法编译,因为缺少依赖项。或者它下载了一个预构建的包(当时可能是一个鸡蛋),在使用时它因SEGFAULT而崩溃,因为它是为另一个系统构建的。这是一场噩梦。

这个问题从2012年开始由pip和轮子解决。然后等待多年,等待人们采用这些工具,并等待这些工具传播到稳定的Linux发行版(许多开发人员依赖/usr/bin/python)。二进制包的问题延伸到2010年代末。

作为参考,这就是为什么在过时的系统上运行的第一个命令是python3 -m venv myvenv && source myvenv/bin/activate && pip install --upgrade pip setuptools,因为操作系统带有5年前的旧python+pip,它有错误,无法识别当前的包格式。

Conda同时开发了他们自己的解决方案。Anaconda是专门为了使数据科学库易于开箱即用(数据科学=C和C++无处不在),因此他们必须想出一个包管理器,专门用于解决构建和分发二进制包的问题,conda。

如果您现在安装任何带有#0的包,它就可以正常工作。这是安装包的推荐方式,它内置在当前版本的Python中。

(2022更新)这个答案来自上面的@user5994461

您可以使用pip进行包管理。Pip是自Python 3以来Python.org的官方内置包管理器。

pip不是虚拟环境管理器。

pip

  • 基础

  • pip是python的默认包管理器

  • pip是从Python 3.0开始内置的

  • 用法:python3 -m venv myenv; source myenv/bin/activate; python3 -m pip install requests

  • 包从pypi.org下载,官方公共python存储库

  • 它可以在可用时安装预编译的二进制文件(轮子)或源(tar/zip存档)。

  • 编译的二进制文件很重要,因为许多包混合了Python/C/其他与第三方依赖项和复杂的构建链。它们必须作为二进制文件分发才能随时可用。

  • 先进

  • pip实际上可以从任何存档、轮子或git/svn存储库安装…

  • …可以位于磁盘、HTTP URL或个人pypi服务器上。

  • pip install git+https://github.com/psf/requests.git@v2.25.0例如(它可以用于测试分支上的补丁)。

  • pip install https://download.pytorch.org/whl/cpu/torch-1.9.0%2Bcpu-cp39-cp39-linux_x86_64.whl(该轮是Linux上的Python 3.9)。

  • 从源代码安装时,pip会自动构建包。(这并不总是可能的,尝试在没有谷歌构建系统的情况下构建TensorFlow:D)

  • 二进制轮子可以是python版本特定的和操作系统特定的,请参阅manylinux规范以最大限度地提高可移植性。

conda

  • conda是由开源社区维护的开源环境管理器和包管理器。它与Anaconda, Inc.分开,不需要商业许可证即可使用。

  • conda还捆绑到Anaconda Navigator中,Anaconda, Inc.蟒蛇)是一个流行的商业Python发行版,其中包括最常见的数据科学和随时可用的Python开发人员库。

  • 当您使用Anaconda Navigator GUI时,您将使用conda。

  • 软件包可以从conda-forge、anaconda repo4和其他公共和私人conda软件包“通道”(又名repos)下载。

  • 它只安装预编译的包。

  • conda有自己的包格式。它不使用轮子。

  • conda install安装一个包。

  • conda build构建一个包。

  • conda可以构建python解释器(以及它所依赖的其他C包)。这就是为Anaconda Navigator构建和捆绑解释器的方式。

  • conda允许安装和升级Python解释器(pip不允许)。

  • 先进

  • 从历史上看,conda的一个卖点是支持构建和安装二进制包,因为pip对二进制包的支持不是很好(直到车轮和manylinux2010规范)。

  • 强调构建包。conda具有广泛的构建设置,它存储了大量的元数据,以处理依赖关系和构建链。

  • 一些项目使用conda来启动复杂的构建系统并生成一个轮子,该轮子发布到pip的pypi.org。

  • conda强调构建和管理虚拟环境。conda是一个与编程语言无关的虚拟环境管理器。conda可以安装和管理其他包管理器,如npm、pip和其他语言包管理器。

  • 我可以将Anaconda Navigator软件包用于商业用途吗?新语言规定,允许个人爱好者,学生,大学,非营利组织或员工少于200人的企业使用,所有其他使用都被视为商业用途,因此需要与Anaconda建立业务关系。

  • 如果您是一个大型开发人员组织,即超过200名员工,则不允许将Anaconda或来自Anaconda存储库的包用于商业用途,除非您获得许可证。

  • 从conda-forge存储库中提取和使用(正确开源)软件包不需要Anaconda, Inc.的商业许可证,开发人员可以使用conda-forge基础设施中提供的打包工具自由构建自己的conda软件包。

easy_install/鸡蛋

  • 仅供历史参考。请勿使用
  • 鸡蛋是一种废弃的包装格式,它被使用到2010年代中期和完全被轮子取代
  • 鸡蛋是一个zip存档,它包含python源文件和/或编译库。
  • 鸡蛋与easy_install和pip的第一个版本一起使用。
  • easy_install是另一个包管理器,在pip和conda之前。它在setupols v58.3(2021年)中被删除。
  • 它也引起了很多混乱,就像pip vs conda: D
  • Eg文件加载缓慢,指定不当,并且特定于操作系统。
  • 每个蛋都设置在一个单独的目录中,import mypackage必须在可能的数百个目录中查找mypackage.py(安装了多少库?)。这很慢,对文件系统缓存不友好。

Fun事实:构建Python解释器唯一严格要求的依赖项是zlib(一个zip库),因为压缩是加载更多包所必需的。鸡蛋和轮子包是zip文件。

为什么有这么多选择?

问得好。

让我们深入研究Python和计算机的历史。=D

纯python包在这些打包器中一直运行良好。问题是不仅仅是Python包。

世界上大多数代码都依赖于C语言,这对于Python解释器来说是如此,这是用C语言编写的,对于许多Python包来说也是如此,这些包是围绕C库或混合python/C/C++代码的项目的python包装器。

任何涉及SSL、压缩、GUI(X11和Windows子系统)、数学库、GPU、CUDA等的东西……通常都与一些C代码相结合。

这给打包和分发Python库带来了麻烦,因为它不仅仅是可以在任何地方运行的Python代码。必须编译库,编译需要编译器和系统库以及第三方库,然后一旦编译,生成的二进制代码仅适用于编译它的特定系统和python版本。

最初,python可以很好地分发纯python库,但对分发二进制库的支持很少。在2010年左右,你会遇到很多错误,试图使用numpycassandra。它下载了源代码并无法编译,因为缺少依赖项。或者它下载了一个预构建的包(当时可能是一个鸡蛋),在使用时它因SEGFAULT而崩溃,因为它是为另一个系统构建的。这是一场噩梦。

这个问题从2012年开始由pip和轮子解决。然后等待多年,等待人们采用这些工具,并等待这些工具传播到稳定的Linux发行版(许多开发人员依赖/usr/bin/python)。二进制包的问题延伸到2010年代末。

作为参考,这就是为什么在过时的系统上运行的第一个命令是python3 -m venv myvenv && source myvenv/bin/activate && pip install --upgrade pip setuptools,因为操作系统带有5年前的旧python+pip,它有错误,无法识别当前的包格式。

连续分析(后来更名为Anaconda, Inc.)并行开发自己的解决方案(作为Anaconda Navigator发布)。Anaconda Navigator专门旨在使数据科学库易于开箱即用(数据科学=C和C++无处不在),因此他们提出了一个包管理器,专门用于解决构建和分发二进制包的问题,并将其构建到环境管理器conda中。

如果您现在安装任何带有#0的包,它通常只是有效。 pip是安装内置到当前Python版本中的包的推荐方法。