【问题标题】:What is the difference between pip and conda?pip 和 conda 有什么区别?
【发布时间】:2014-01-26 11:57:39
【问题描述】:

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

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

pipconda 有什么区别?

【问题讨论】:

  • 一个区别是 pip 比 conda 可以安装更多的东西:pip 可以在一个命令中从 pypi 安装任何东西。 conda 需要三个命令:skeleton、build、install,如果不起作用,可能还需要更多命令。 pip 可以在一个命令中从 github 或源安装任何东西。 conda 需要编写一个“配方”,这并不容易,尤其是因为文档似乎总是不正确/过时。
  • 相关问题:pip 比 conda 有什么优势?我在下面看到了很多 Anaconda 的宣传,但一点也没有。如果 anaconda 如此出色,为什么 pip 仍然是标准?
  • 我觉得这句话很有启发性:“Pip 是包管理器,Virtualenv 是环境管理器。Conda既是。” (ref.)
  • 观察:我以前认为 conda 暗示要下载无数个包,但这显然不再正确:您可以安装 miniconda,它似乎本质上只是包管理器,conda.io/docs/install/quick.html
  • @RichLysakowskiPhD 如何从 pypi 安装?

标签: python pip ipython package-managers conda


【解决方案1】:

引用Conda blog:

涉足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),但它们也不能互操作。

自从写下这个答案后,Anaconda 已经发布了new page on Understanding Conda and Pip,这也与此相呼应:

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

还有更多

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

【讨论】:

  • 感谢您的解释。但是,我仍然对 Conda 是否可以取代 pip 感到困惑?即,Conda 能做 pip 能做的所有事情吗?
  • @lazywei:我不认为它可以;例如,Conda 似乎不支持 wheel 存档格式。他们有不同的目标。
  • @naught101 "只需创建一个食谱" 这不像输入 pip install 那样简单。
  • 能否向我解释一下,如果您使用 pip 和 conda 安装相同的包,但版本不同,python 导入它们时会使用哪个包?
  • @jrh:使用 OS 包管理器时,不能并排安装同一个包的多个版本,而不是作为核心功能。 Conda 管理环境,每个环境都有自己的特定版本的已安装包组合。因此,项目 A 已经开发了一段时间,仍然可以使用旧版本的库 Foo(没有资源可用于升级项目以使用新版本),而项目 B 需要同一库的最新版本。
【解决方案2】:

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

这是一个简短的摘要:

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

康达

  • Python 不可知论。现有包的主要重点是 Python,Conda 本身确实是用 Python 编写的,但您也可以拥有用于 C 库或 R 包或其他任何东西的 Conda 包。
  • 安装二进制文件。有一个名为 conda build 的工具可以从源代码构建包,但 conda install 本身会从已构建的 Conda 包中安装东西。
  • 外部。 Conda 是 Continuum Analytics 提供的 Python 发行版 Anaconda 的包管理器,但它也可以在 Anaconda 之外使用。您可以通过 pip 安装将其与现有 Python 安装一起使用(尽管不建议这样做,除非您有充分的理由使用现有安装)。

在这两种情况下:

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

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

如果您有兴趣构建自己的软件包,也会有一些差异。例如,pip 是在 setuptools 之上构建的,而 Conda 使用自己的格式,这种格式有一些优点(比如是静态的,并且与 Python 无关)。

【讨论】:

  • pip 不再从源代码构建所有内容。如果轮子可用,pip install --use-wheel <package> 将安装一个内置包。见这里:wheel.readthedocs.org/en/latest。然而,我对轮子的个人经验是,可用的科学轮子包太少了,它纯粹是学术性的。当然,如果您的构建环境设置不正确,那么 pip install 在 Windows 上大多也不起作用。所以目前,conda ftw。
  • 轮子仍然是新的,默认情况下不使用,所以它们的数量并不多也就不足为奇了。不过,Wheel 仍然适合“特定于 Python”的类别,这意味着它可能不适合非 Python 包或依赖于非 Python 包的 Python 包。
  • 我不得不对此投反对票:第二个要点现在只是一个历史记录,但你稍后也会继续。如今的主要区别在于 pip 是一个包管理器,而 conda 更像是一个环境管理器。
  • 确实 pip 可以从源代码编译,但随着越来越多的包转移到轮子上,这种情况变得越来越少:这些天我可以用 pip 在几秒钟内安装大部分我需要的东西。所以并不是这个答案是错误的,它只是变得有点过时了,因为 pip 在过去几年里有了很大的改进
  • 确实从来没有 pip 只能从源安装。在轮子之前,我们将鸡蛋作为默认的二进制安装格式和推荐的 Windows 安装分发格式,如果这是最好的可用选项,pip 会(并且仍然会)安装鸡蛋。
【解决方案3】:

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

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 来自。

【讨论】:

  • 根据您的最后一点,third-party conda-forge project 已迅速成为发布 Anaconda 软件包的行业标准方法。 We recently published several conda-forge-hosted packages for our multiphysics biology simulator - 不能足够推荐这个过程。有一个基于 GitHub PR 的同行评审组件可以向 conda-forge 提交新配方,但 conda-forge 自动化方面的优势远远超过了前期时间投资。 砰!
  • @CecilCurry 我在我的代码中导入了Keras,在我的mac 上安装了anaconda,Keras 同时安装了condapip。那么,在终端中运行我的代码时,我如何知道正在导入哪个keraspip 一个或conda 一个)?
【解决方案4】:

为了不让你更困惑, 但是您也可以在您的 conda 环境中使用 pip,它可以验证上面的通用管理器与特定于 python 的管理器 cmets。

conda install -n testenv pip
source activate testenv
pip <pip command>

您还可以将 pip 添加到任何环境的默认包中,这样它每次都存在,因此您不必遵循上面的 sn-p。

【讨论】:

  • 我认为不推荐这样做?
  • 完全推荐在 conda 中使用 pip。最好使用 conda 安装,但是对于任何没有 conda 构建的包,使用 pip 是完全可以接受的。
  • nit:这句话好像是fully supportedfully recommended 暗示,在我看来,在 conda 环境中使用 pip 比使用 conda 更好,而且我不确定你/他们的意思是什么?
【解决方案5】:

对于 WINDOWS 用户

“标准”打包工具的情况最近有所好转:

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

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

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

  • 您可以在 http://www.lfd.uci.edu/~gohlke/pythonlibs 找到几乎所有车轮格式的科学软件包,

  • mingwpy 项目有一天可能会为 Windows 用户带来一个“编译”包,允许在需要时从源代码安装所有内容。

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

(此外,在标准 Wheel 系统和 conda 系统或 buildout 中,多方面的依赖规范并不是 Python 的,如果所有这些打包“核心”技术都可以通过一种 PEP 收敛,那就太好了)

【讨论】:

    【解决方案6】:

    引用来自Conda for Data Science Continuum 网站的文章:

    Conda 与 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
    

    【讨论】:

    • 这是我需要的,之前我已经在 pip 中安装了这个包,但是我无法在我的 conda 环境中导入它。这有助于解决问题。
    【解决方案7】:

    引自Conda: Myths and Misconceptions(综合描述):

    ...

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

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

    Pip,代表 Pip Installs Packages,是 Python 官方认可的包管理器,最常用于安装在 Python 包索引 (PyPI) 上发布的包。 pip 和 PyPI 均由 Python 打包机构 (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、pytorch.org,并推荐:conda
    • “在隔离环境中安装 Python 包”是大多数 Python 开发人员使用 pip 的主要目的。
    • @Nick 是不是当开发人员已经在“那个”虚拟环境中时?我认为 pip 在虚拟环境中工作并安装包,就好像它正在为系统安装一样。但是正如 sanchos.s 所说,它只安装 python 包并且不关心底层库。如果我错了,请任何人纠正我。
    【解决方案8】:

    我可以使用 pip 安装 iPython 吗?

    当然,两者都有(页面上的第一种方法)

    pip install ipython
    

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

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

    pip install .
    

    officially recommended ways to install

    既然我已经有了 pip,为什么还要使用 conda 作为另一个 python 包管理器?

    正如here所说:

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

    Conda 在 (YMMV) 中超过 pip

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

    pip 和 conda 有什么区别?

    其他人都广泛回答。

    【讨论】:

      【解决方案9】:

      pip 仅适用于 Python

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

      【讨论】:

      • 简单的解释,但我被教导直接去 Anaconda 的网站下载 Python 2.x 或 3.x 发行版。为什么? > 因为它包含学生需要的所有包。 Numpy、Scipy、matpliotlib、sklearn 等。这正是在理解更精细的基本细节方面存在差距的原因。学生
      • 我知道这是一个旧答案,但你写的关于 Conda/Anaconda 的内容对我来说似乎完全错误。
      • @Galapagos 您的回答具有误导性和错误性。 Anaconda 是几个行业标准的 Python 发行版之一。 conda 与 Anaconda 是分开的,但它由 Anaconda 使用。同样在今天,“Anaconda 主要面向那些从事机器学习/深度学习等工作的人。休闲 Python 开发人员不会在他的笔记本电脑上运行 Anaconda。”是公然错误和过时的。 Anaconda 是当今使用 Python 进行的大多数分析和数据科学工作的默认设置。
      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

        pip 是包管理器。

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

        详情:

        参考文献

        【讨论】:

        • 我想知道这个“依赖检查”到底是什么,pip 正在检查依赖兼容性。 ERROR: package-a 0.5.9 has requirement package-b~=0.2.0, but you'll have package-b 1.0.1 which is incompatible.(比 conda 快得多)。
        【解决方案12】:

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

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

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

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

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

        • 如果您需要的软件包仅存在于一个上,并且 其他没有。
        • 您需要仅在一种环境中可用的特定版本

        【讨论】:

          【解决方案13】:

          (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 实际上可以从任何存档、轮子或 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。

          • 包从the anaconda repo下载。

          • 它只安装预编译的包。

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

          • conda install 安装一个包。

          • conda build 构建一个包。

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

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

          • 高级

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

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

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

          easy_install/egg

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

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

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

          为什么有这么多选择?

          一个好问题。

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

          纯 python 包在任何这些打包器中都可以正常工作。麻烦不仅在于 Python 包。

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

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

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

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

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

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

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

          如果您现在使用pip install xxx 安装任何软件包,它就可以正常工作。这是安装软件包的推荐方式,它已内置在当前版本的 Python 中。

          【讨论】:

            猜你喜欢
            • 2021-01-08
            • 2018-12-13
            • 1970-01-01
            • 2015-07-14
            • 1970-01-01
            • 1970-01-01
            • 2017-05-06
            • 2016-02-10
            • 1970-01-01
            相关资源
            最近更新 更多