pip和conda有什么区别?

laz*_*wei 644 python pip package-managers ipython conda

我知道pip是python包的包管理器.但是,我看到IPython网站conda上的安装用于安装IPython.

我可以pip用来安装IPython吗?conda我已经拥有了为什么要用作另一个python包管理器pip

pip和之间有什么区别conda

Mar*_*ers 460

引自Conda博客:

我们长期参与python世界,我们都知道pip,easy_install和virtualenv,但这些工具并不能满足我们所有的特定要求.主要问题是它们专注于Python,忽略了非Python库依赖项,如HDF5,MKL,LLVM等,它们的源代码中没有setup.py,也没有将文件安装到Python的站点中-packages目录.

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

因此,Conda应该与Buildout进行比较,是另一个可以让你处理Python和非Python安装任务的工具.

因为Conda推出了一种新的包装形式,你不能pip互换使用和Conda; pip无法安装Conda包格式.您可以使用并排的两个工具侧(通过安装pipconda install pip),但他们不具备互操作性无论是.

  • @ naught101"只需创建一个食谱"这不像输入`pip install`那么容易. (41认同)
  • 有些人可以向我解释一下,如果你使用pip和conda来安装相同的软件包会有什么不同,除了使用不同的版本,导入时会使用python吗? (22认同)
  • 谢谢你的解释.然而,我仍然对Conda是否可以取代pip感到困惑?也就是说,康达能做点什么吗? (18认同)
  • @lazywei:我认为不可以; 例如,它看起来不像Conda支持滚轮归档格式.他们有不同的目标. (10认同)
  • `conda` 创建的所有东西都在警告你不要使用 `pip`,因为你会破坏东西。我会坚持其中一个。 (3认同)
  • @jrh:是的,您可以通过从源代码,本地编译库或通过将特定版本的共享对象放在特定位置以及某些按项目配置将它们分开来进行相同的操作,但是当您必须这样做时在不同的OS和许多不同的项目中,突然有了像Conda这样的东西可以为您管理*,并为您准备好预编译的软件包,这真的很有吸引力。特别是当开发人员真正是数据科学家而不是软件工程师时。 (3认同)
  • @jrh:使用OS软件包管理器时,不能并排安装同一软件包的多个版本,而不能作为核心功能。Conda管理*环境*,每个环境都有自己特定版本的已安装软件包的组合。因此,前一段时间开发的项目A仍可以使用旧版本的库Foo(没有可用资源来升级该项目以与较新版本一起使用),而项目B则需要该库的最新版本。 (2认同)
  • 为什么Ananconda不仅扩展点数? (2认同)
  • @Phil:当Anaconda以高于运行pip所需的Python二进制文件的级别管理软件时,您甚至会怎么做?Conda管理Python二进制文件,也可以管理未安装Python的环境,因此也无需管理pip。 (2认同)
  • 我觉得此评论部分中的某些内容可以在某个地方(可能在标签Wiki中)提供很好的FAQ。[conda] Wiki看起来[有点裸露](https://stackoverflow.com/tags/conda/info) (2认同)

asm*_*rer 234

这是一个简短的纲要:

果仁

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

康达

  • Python不可知论者.现有软件包的主要关注点是Python,实际上conda本身是用Python编写的,但你也可以为C库或R软件包或任何东西提供conda软件包.
  • 安装二进制文件.有一个工具称为conda build从源构建包,但conda install它本身安装了已经构建的conda包中的东西.
  • 外部.Conda是Anaconda的包管理器,它是由Continuum Analytics提供的Python发行版,但它也可以在Anaconda之外使用.您可以通过pip安装将它与现有的Python安装一起使用(尽管除非您有充分的理由使用现有安装,否则不建议这样做).

在这两种情况下:

  • 用Python编写
  • 开源(conda是BSD,pip是麻省理工学院)

conda的前两个要点实际上是什么使它比许多包装的pip更有利.由于pip是从源代码安装的,如果你无法编译源代码,安装它就会很痛苦(在Windows上尤其如此,但如果软件包有一些困难的C或FORTRAN库,它甚至可以在Linux上运行依赖).Conda从二进制安装,意味着有人(例如,Continuum)已经完成了编译包的艰苦工作,因此安装很容易.

如果您有兴趣构建自己的包,也会有一些差异.例如,pip建立在setuptools之上,而conda使用自己的格式,这有一些优点(比如静态,再次,Python不可知).

  • pip不再从源代码构建所有东西.如果有一个轮子,`pip install --use-wheel <package>`将安装一个构建的包.见这里:http://wheel.readthedocs.org/en/latest/.然而,我对车轮的个人经验是,很少有科学的车轮组件可供选择,纯粹是学术性的.当然,如果您的构建环境设置不正确,那么pip安装在Windows上大多数都不起作用.所以此刻,conda ftw. (21认同)
  • 确实,pip可以从源代码编译,但随着更多的软件包转向轮子,这种情况变得越来越少:这些天我可以用pip在几秒钟内安装我需要的大部分内容.所以这并不是说这个答案是错误的,因为pip在过去几年中已经有了很大的改善,所以它已经略显过时了 (9认同)
  • 轮子仍然是新的,默认情况下不会使用,所以它们的确没有很多也就不足为奇了.但是,Wheel仍然属于"特定于Python"的类别,这意味着它可能不适合非Python包或依赖于非Python包的Python包. (4认同)
  • 我不得不这样做:第二个要点现在只是一个历史记录,但你也会在以后再说.这些天的主要区别是pip是一个包管理器,而conda更像是一个环境管理器. (4认同)
  • @Shep 你的意思是编译的东西?Pip 仍然从源代码编译。Conda 从不从源代码编译。conda 的部分核心理念是它将潜在的困难编译步骤留给了包维护者。并且 conda 不是包管理器绝对不是真的。我想你也不认为 apt 或 brew 是包管理器。人们应该将 conda 视为类似的包管理器(它可以安装任何类型的包,而不仅仅是 Python),但与不需要 root、可在任何操作系统上运行并具有环境支持的包不同。 (4认同)
  • 从来没有如此,pip只能从源代码安装。在安装轮子之前,我们将鸡蛋作为默认的二进制安装格式,并建议将其作为Windows安装的推荐分发格式,如果可能的话,pip将(仍然会)安装鸡蛋。 (3认同)
  • 对于 Windows 开发人员来说,这个答案在 2020 年 7 月仍然是最新的。我尝试使用 pip 安装 [Theano](http://deeplearning.net/software/theano/install_windows.html),并在遇到 `cmake 之后我的 Windows 10 系统找不到 ` 和 `make` 命令,我不得不恢复到 Conda,它为我完成了一切。恕我直言,[asmeurer](/sf/users/11326101/) 的关键内容是:“_conda 核心理念的一部分是它将潜在困难的编译步骤留给了包维护者_” (3认同)
  • 有关您可以使用conda处理的事物的概念,请查看https://github.com/conda/conda-recipes.此外,这个答案还说明了conda也是一个环境管理者这一事实,而对于pip,你必须回归到像virtualenv这样可怕的事情. (2认同)

Cal*_*ngh 92

其他答案给出了详细的详细描述,但我想强调一些高级别的要点.

pip是一个包管理器,便于安装,升级和卸载python包.它也适用于虚拟python环境.

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

conda设计的目标之一是促进用户所需的整个软件堆栈的包管理,其中一个或多个python版本可能只是一小部分.这包括低级库,如线性代数,编译器,如Windows上的mingw,编辑器,Hg和Git等版本控制工具,或其他需要分发和管理的工具.

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

Conda允许您在多个通用环境之间切换和管理,其中多个其他内容可能因版本号而异,例如C库,编译器,测试套件或数据库引擎等.

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

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

最后,Continuum Analytics还托管(免费)binstar.org(现在称为anaconda.org),允许常规软件包开发人员创建自己的自定义(内置!)软件堆栈,其软件包用户可以从中conda install获得.

  • 根据您的最后一点,[第三方**conda-forge**项目](https://conda-forge.org)已迅速成为发布Anaconda软件包的行业标准方法.[我们最近为[我们的多物理场生物学模拟器](https://gitlab.com/betse/betse)发布了几个conda-forge托管软件包(https://anaconda.org/conda-forge/betse) - 而且不能推荐这个过程就好了.有一个基于GitHub PR的同行评审组件,用于向conda-forge提交新配方,但conda-forge自动化方面的优势远远超过前期时间投资.*巴姆!* (3认同)

use*_*461 59

(2021 年更新)

TL;DR 使用 pip,它是 Python 3 以来的官方包管理器。

  • 基本

  • pip 是 python 默认的包管理器

  • pip 从 Python 3.0 开始是内置的

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

  • 软件包是从官方公共 python 存储库pypi.org下载的

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

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

  • 先进的

  • pip 实际上可以从任何存档、wheel 或 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 会自动构建包。(这并不总是可能的,尝试在不使用 google 构建系统的情况下构建 TensorFlow :D)

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

康达

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

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

  • 它由anaconda普及,这是一个 Python 发行版,包括最常见的即用型数据科学库。

  • 当你使用anaconda时你就会使用conda。

  • 软件包是从anaconda repo下载的。

  • 它只安装预编译的包。

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

  • conda install安装一个包。

  • conda build构建一个包。

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

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

  • 先进的

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

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

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

简易安装/鸡蛋

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

从历史上看,上述三个工具都是开源的,并且是用 Python 编写的。然而 conda 背后的公司在 2020 年更新了服务条款,禁止商业用途,请注意!

Funfact:构建 Python 解释器唯一严格要求的依赖项是 zlib(一个 zip 库),因为需要压缩才能加载更多包。Eggs 和wheels 包是zip 文件。

为什么有这么多选择?

这是个好问题。

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

纯 python 包始终可以与这些打包器一起正常工作。问题不仅出在 Python 包上。

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

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

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

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

从 2012 年起,pip 和wheels 解决了这个问题。然后等待很多年,等待人们采用这些工具,并等待这些工具传播到稳定的 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 。

如果你现在安装任何软件包pip install xxx,它就可以工作。这是安装包的推荐方法,并且它内置于当前版本的 Python 中。


小智 25

不要混淆你,但你也可以在你的conda环境中使用pip,它可以验证上面的一般与python特定的管理者评论.

conda install -n testenv pip
source activate testenv
pip <pip command>
Run Code Online (Sandbox Code Playgroud)

您还可以将pip添加到任何环境的默认包中,以便每次都存在,这样您就不必遵循上面的代码段.

  • 完全建议在conda中使用pip.最好使用conda进行安装,但是对于没有conda构建的任何软件包,使用pip是完全可以接受的. (7认同)
  • nit:这句话似乎是“完全支持”的?“完全推荐”意味着,在我看来,在 conda 环境中使用 pip 比使用 conda 更好,而且我不确定您/他们的意思是什么? (5认同)

Che*_*sta 20

引用Conda for Data Science的文章到连续统一网站:

康达vs pip

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

  • Pip特定于Python包,conda与语言无关,这意味着我们可以使用conda来管理来自任何语言的包Pip从源代码编译并且conda安装二进制文件,消除了编译的负担
  • Conda本地创建与语言无关的环境,而pip依赖virtualenv来管理Python环境虽然建议始终使用conda包,但conda还包括pip,因此您不必在两者之间进行选择.例如,要安装一个没有conda包但通过pip可用的python包,只需运行,例如:
conda install pip
pip install gensim
Run Code Online (Sandbox Code Playgroud)

  • 这就是我所需要的,之前我已经在 pip 中安装了该软件包,但我无法将其导入到我的 conda 环境中。这有助于解决问题。 (2认同)

Sim*_*mba 16

pip 是一个包管理器。

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

细节:

在此处输入图片说明

参考

  • 我想知道这个“依赖项检查”到底是什么,pip 正在检查依赖项兼容性。`错误:package-a 0.5.9 要求 package-b~=0.2.0,但您将拥有不兼容的 package-b 1.0.1。`(比 conda 快得多)。 (3认同)

san*_*ica 13

引自康达:神话和误解(综合描述):

...

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

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

Pip代表P ip I nstalls P ackages,是Python官方认可的软件包管理器,最常用于安装Python Package Index(PyPI)上发布的软件包.pip和PyPI都受Python Packaging Authority(PyPA)的支配和支持.

简而言之,pip是Python包的通用管理器; conda是一个与语言无关的跨平台环境管理器.对于用户来说,最显着的区别可能就是:pip在任何环境中安装python包; conda在conda环境中安装任何软件包.如果您所做的只是在隔离环境中安装Python包,那么conda和pip + virtualenv大多可以互换,模块化依赖性处理和包可用性方面的差异.隔离环境我指的是conda-env或virtualenv,您可以在其中安装包而无需修改系统Python安装.

即使放弃神话#2,如果我们只关注Python包的安装,conda和pip会为不同的受众和不同目的服务.如果你想在现有的系统Python安装中管理Python包,conda无法帮助你:按照设计,它只能在conda环境中安装包.如果您想要使用许多依赖于外部依赖项的Python包(NumPy,SciPy和Matplotlib是常见示例),在以有意义的方式跟踪这些依赖项时,pip无法帮助您:按设计,它管理Python包,只管理Python包.

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

  • 除了市场定位之外,我不确定这是不是真的。以pytorch为例,它提供了三种安装方式:conda、pip、source、http://pytorch.org/,并推荐:conda (2认同)
  • "在隔离环境中安装Python包"是大多数Python开发人员使用pip的主要方式. (2认同)

sto*_*big 12

对于WINDOWS用户

"标准"包装工具的情况最近有所改善:

  • 在pypi本身,截至9月,现在有48%的车轮包装.2015年11月(2015年5月为38%,2014年9月为24%),

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

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

"Conda"包装对其所服务的市场仍然更好,并突出了"标准" 应该改进的领域.

(此外,依赖规范多次努力,在标准轮系统和conda系统或buildout中,并不是非常pythonic,如果所有这些包装'核心'技术可以通过某种PEP汇聚,那将是很好的)


Don*_*d S 6

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

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

重要的警告注意事项:如果您使用两个源(pip 和 conda)在同一环境中安装软件包,这可能会在以后引起问题。

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

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

  • 当您需要的软件包仅存在于一个软件包中,而另一个软件包中没有它们时。
  • 您需要仅在一种环境中可用的特定版本