pip 和 conda 有什么区别?
- 2024-12-13 08:36:00
- admin 原创
- 175
问题描述:
我知道这是一个用于 Python 包的包管理器。但是,我在 IPython 的网站上看到了安装 IPython 的pip
说明。conda
我可以使用pip
安装 IPython 吗?conda
既然我已经有了,为什么还要使用另一个 Python 包管理器pip
?
pip
和有什么区别conda
?
解决方案 1:
引用自Conda 博客:
我们已经涉足 Python 世界很久了,所以都知道 pip、easy_install 和 virtualenv,但这些工具并不能满足我们所有的具体要求。主要问题是它们专注于 Python,而忽略了非 Python 库依赖项,例如 HDF5、MKL、LLVM 等,它们的源代码中没有 setup.py,也不会将文件安装到 Python 的 site-packages 目录中。
因此,Conda 是一个打包工具和安装程序,其目的不仅仅是处理 Python 包之外pip
的库依赖关系以及 Python 包本身。Conda 还创建了一个虚拟环境。virtualenv
因此,Conda 应该与Buildout进行比较,后者是另一个允许您处理 Python 和非 Python 安装任务的工具。
由于 Conda 引入了一种新的打包格式,因此您无法pip
互换使用和 Conda; pip
无法安装 Conda 包格式。您可以并排使用这两种工具(通过使用 安装pip
)conda install pip
,但它们也不能互操作。
自从写下这个答案以来,Anaconda 已经发布了一个关于理解 Conda 和 Pip 的新页面,其中也呼应了这一点:
这突出了 conda 和 pip 之间的一个关键区别。Pip 安装 Python 包,而 conda 安装的包可能包含用任何语言编写的软件。例如,在使用 pip 之前,必须通过系统包管理器或下载并运行安装程序来安装 Python 解释器。另一方面,Conda 可以直接安装 Python 包以及 Python 解释器。
并进一步
有时,需要的包不是 conda 包,但 PyPI 上有,可以用 pip 安装。在这些情况下,尝试同时使用 conda 和 pip 是有意义的。
解决方案 2:
免责声明:此答案描述了十年前的情况,当时 pip 不支持二进制包。Conda 是专门为更好地支持构建和分发二进制包而创建的,特别是具有 C 扩展的数据科学库。作为参考,pip 仅获得了对带轮子的便携式二进制包(2013 年的 pip 1.4)和manylinux1规范(2016 年 3 月的 pip 8.1)的广泛支持。有关更多历史记录,请参阅最近的答案。
以下是简要概述:
点子
仅限 Python 包。
从源代码编译所有内容。编辑:pip 现在安装二进制轮子(如果可用)。
受到核心 Python 社区的青睐(即 Python 3.4+ 包含自动引导 pip 的代码)。
康达
与 Python 无关。现有软件包主要针对 Python,Conda 本身确实是用 Python 编写的,但您也可以使用适用于 C 库或 R 包或任何其他包的 Conda 软件包。
安装二进制文件。有一个名为的工具
conda build
可以从源代码构建软件包,但conda install
它本身会从已构建的 Conda 软件包中安装东西。外部。conda 是一个环境和包管理器。它包含在 Continuum Analytics(现称为 Anaconda, Inc.)提供的 Anaconda Python 发行版中。
conda 是一个用 Python 编写的环境管理器,与语言无关。conda 环境管理功能涵盖了 venv、virtualenv、pipenv、pyenv 和其他特定于 Python 的包管理器提供的功能。您可以通过 pip 安装 conda 在现有的 Python 安装中使用它(尽管除非您有充分的理由使用现有安装,否则不建议这样做)。截至 2022 年,conda 和 pip 还不完全了解虚拟环境中彼此的包管理活动,并且它们不能互操作 Python 包管理。
在这两种情况下:
用 Python 编写
开源(conda 是 BSD,pip 是 MIT)
警告:虽然 conda 本身是开源的,但软件包存储库由 Anaconda Inc 托管,并且对商业使用有限制。
conda 的前两个要点是它在许多软件包方面优于 pip 的真正原因。由于 pip 从源代码安装,如果您无法编译源代码,则使用它安装东西可能会很麻烦(这在 Windows 上尤其如此,但如果软件包有一些困难的 C 或 FORTRAN 库依赖项,在 Linux 上也是如此)。conda 从二进制文件安装,这意味着有人(例如 Continuum)已经完成了编译软件包的艰苦工作,因此安装很容易。
如果您有兴趣构建自己的软件包,那么还有一些差异。例如,pip 是在 setuptools 之上构建的,而 conda 使用自己的格式,这有一些优势(例如是静态的,并且与 Python 无关)。
解决方案 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
。
解决方案 4:
(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
软件包是从pypi.org(官方公共 Python 存储库)下载的
它可以在可用时安装预编译的二进制文件(wheels)或源代码(tar/zip 存档)。
编译后的二进制文件非常重要,因为许多软件包混合了 Python/C/其他语言以及第三方依赖项和复杂的构建链。它们必须以二进制文件形式分发才能随时可用。
先进的
pip 实际上可以从任何档案、wheel 或 git/svn repo 安装......
...可以位于磁盘上、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 使用。
easy_install/egg
仅供历史参考。请勿使用
egg 是一种被废弃的软件包格式,它一直使用到 2010 年代中期,并被wheels 完全取代。
egg 是一个 zip 档案,它包含 python 源文件和/或编译的库。
easy_install
eggs与 pip 的第一个版本一起使用。easy_install
是另一个包管理器,早于 pip 和 conda。它在 setuptools v58.3(2021 年)中被删除。它也引起了很多混乱,就像 pip 与 conda 一样:D
egg 文件加载缓慢、规格不明确、且特定于操作系统。
每个 egg 都安装在一个单独的目录中,
import mypackage
可能需要在数百个目录中查找mypackage.py
(安装了多少个库?)。这很慢,而且对文件系统缓存不友好。
从历史上看,上述三个工具都是开源的,用 Python 编写。然而,conda 背后的公司在 2020 年更新了其服务条款,禁止商业使用,请注意!
事实:构建 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 库,但对分发二进制库的支持很少。在 2010 年左右,您在尝试使用numpy
或时会遇到很多错误cassandra
。它下载了源代码,但由于缺少依赖项而无法编译。或者它下载了一个预构建的包(当时可能是 egg),并且在使用时因 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
nowadays 安装任何包,它都可以正常工作。这是安装包的推荐方法,它已内置在当前版本的 Python 中。
解决方案 5:
为了不让您进一步感到困惑,但您也可以在 conda 环境中使用 pip,这验证了上述通用管理器与 python 特定管理器的评论。
conda install -n testenv pip
source activate testenv
pip <pip command>
您还可以将 pip 添加到任何环境的默认包中,以便它每次都存在,因此您不必遵循上述代码片段。
解决方案 6:
引用Continuum 网站上有关Conda for Data Science 的文章:
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
解决方案 7:
pip
是一个包管理器。
conda
既是一个包管理器,又是一个环境管理器。
细节:
依赖性检查
Pip 和 conda 在环境内依赖关系的实现方式上也有所不同。安装软件包时,pip 会以递归、串行循环的方式安装依赖项。它不会确保同时满足所有软件包的依赖项。如果按顺序较早安装的软件包与按顺序较晚安装的软件包具有不兼容的依赖项版本,则这可能会导致环境以微妙的方式被破坏。相比之下,conda 使用可满足性 (SAT) 求解器来验证环境中安装的所有软件包的所有要求是否都得到满足。此检查可能需要额外的时间,但有助于防止创建损坏的环境。只要有关依赖项的软件包元数据正确,conda 就会可预测地生成工作环境。
参考
了解 Conda 和 Pip
解决方案 8:
引用自《Conda:神话与误解》(全面描述):
...
误解三:Conda 和 pip 是直接竞争对手
现实:Conda 和 pip 的用途不同,并且仅在一小部分任务中直接竞争:即在隔离环境中安装 Python 包。
Pip 代表P ip Installs P ackages,是 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 不是竞争对手,而是专注于不同用户群体和使用模式的工具。
解决方案 9:
对于 WINDOWS 用户
“标准”包装工具的情况最近有所改善:
在 pypi 上,截至 2015 年 9 月 11 日,wheel 软件包已占到 48%(2015 年 5 月为 38%,2014 年 9 月为 24%),
最新的 Python 2.7.9 现已支持开箱即用的 wheel 格式,
“标准”+“调整”包装工具的情况也在改善:
你可以在http://www.lfd.uci.edu/~gohlke/pythonlibs找到几乎所有关于轮子格式的科学软件包,
mingwpy 项目可能有一天会为 Windows 用户带来一个“编译”包,允许在需要时从源代码安装所有内容。
“Conda”包装仍然更适合其服务的市场,并突出了“标准”应该改进的领域。
(此外,在标准 wheel 系统和 conda 系统或 buildout 中,依赖规范的多重努力并不是很符合 Python 风格,如果所有这些打包“核心”技术能够通过某种 PEP 融合在一起,那就太好了)
解决方案 10:
回答最初的问题,
对于安装软件包,PIP 和 Conda 是完成同一件事的不同方式。两者都是安装软件包的标准应用程序。主要区别在于软件包文件的来源。
PIP/PyPI 将会有更多“实验性”软件包,或者更新、不太常见的软件包版本
Conda 通常有更完善的软件包或版本
重要的警告:如果您使用两个源(pip 和 conda)在同一环境中安装包,这可能会在以后引起问题。
重建环境将更加困难
修复软件包不兼容问题变得更加复杂
最佳做法是选择一个应用程序(PIP 或 Conda)来安装软件包,然后使用该应用程序安装所需的任何软件包。但是,仍有许多例外或理由在 conda 环境中使用 pip,反之亦然。例如:
当您需要的包仅在其中一个服务器上存在,而另一个服务器上没有这些包时。
您需要仅在一个环境中可用的特定版本
解决方案 11:
我可以使用 pip 安装 iPython 吗?
当然,两种方法都可以(第一种方法)
pip install ipython
和(第三种方法,第二种是conda
)
您可以从 GitHub 或 PyPI 手动下载 IPython。要安装其中一个版本,请将其解压并使用终端从顶级源目录运行以下命令:
pip install .
是官方推荐的安装方式。
既然我已经有了 pip,为什么还要使用 conda 作为另一个 python 包管理器?
正如这里所说的:
如果您需要一个特定的包,可能只用于一个项目,或者您需要与其他人共享该项目,那么 conda 似乎更合适。
Conda 超越 pip(YMMV)
使用非 Python 工具的项目
与同事分享
在版本之间切换
在具有不同库版本的项目之间切换
pip 和 conda 有什么区别?
其他人都已经详细回答了这个问题。
解决方案 12:
虽然其他答案强调了 pip/conda 的目标和好处,但从包装角度指出它们的问题也可能会很有趣。
pip 的主要问题是通用 C 扩展库不会在多个软件包之间共享。这意味着绑定包必须构建和捆绑其整个扩展依赖关系树,这并不优雅。它会占用比必要更多的磁盘空间,并且基础库的安全修复无法从顶层进行管理,而需要针对每个扩展包单独进行评估。
与此相关,您不能依赖系统级软件包。最终用户必须手动获取这些软件包。例如,如果您的 Python 软件包通过 JPype 使用 Java 库,则用户必须在系统上安装 Java,因为它(显然)太大而无法捆绑在 wheel 中,而且它们不适用于非 Python 系统软件包。
另一方面,Conda 在 sysroot 级别工作,可以跨语言共享库。虽然这在原则上是一个好主意,但 conda 打包在实践中存在许多问题。在我看来,这不是由于概念上的缺陷,而是由于 conda 的实现。
Conda 遵循一种打包模型,即实际项目作者不会将软件包发布到主渠道,而是使用由第三方管理的“配方原料”进行打包。这意味着必须手动进行更新,而且较新或不太受欢迎的软件包通常不可用。许多软件包不会定期更新,因此构建版本可能会丢失,主版本也会过时。此外,第三方打包在某些情况下会导致质量下降(例如 ABI 安全问题)。原作者最了解如何正确构建/配置他们的软件包,而不是第三方。
由于缺乏与 PyPA 风格软件包的互操作性,Conda 还导致了大量打包重复。这在原则上似乎是不必要的 - 为什么 conda 不能提供一个兼容层,允许指定对 PyPA 软件包的依赖关系?所有元数据都会在那里,只是使用不同的约定。但现实是 conda 没有这样做,而且很长时间以来也没有真正的动议来改变这一点。然而,这可以大大减少纯 Python 软件包的维护工作量,并且对某些需要花费大量精力来 conda 软件包的扩展项目很有帮助。
总体而言,对上游项目直接打包的支持较差。使用自定义渠道可能实现,但效果不佳,因为最终用户必须确定各个渠道并手动启用整个渠道树。此外,构建工具似乎很慢且不灵活,非常以原料用例和本机主机为中心。
conda 的另一个限制是其环境概念无法真正解决“依赖地狱”问题。它无法让您通过在同一环境中并行安装包的多个版本来解决冲突。
虚拟环境是一个众所周知的概念,在 PyPA 世界中同样可用。如今,pip 还提供了完整的依赖解析器。
解决方案 13:
pip
仅适用于 Python
conda
仅适用于 Anaconda + 其他科学软件包(如 R 依赖项等)。并非每个人都需要 Python 中自带的 Anaconda。Anaconda 主要面向从事机器学习/深度学习等的人。普通 Python 开发人员不会在笔记本电脑上运行 Anaconda。
解决方案 14:
我可能还发现了一个细微的差别。我的 Python 环境在/usr
而不是/home
或什么的下面。为了安装到它,我必须使用sudo install pip
。对我来说, 的不良副作用sudo install pip
与其他地方广泛报道的略有不同:这样做之后,我必须运行python
才能sudo
导入任何sudo
-installed 包。我放弃了这个,最终发现我可以使用sudo conda
将包安装到一个环境中/usr
,然后正常导入而不需要 的sudo
许可python
。我甚至曾经sudo conda
修复过一个坏掉的pip
而不是使用sudo pip uninstall pip
或sudo pip --upgrade install pip
。
解决方案 15:
人工智能和大型语言模型严重依赖 PyTorch、Tensorflow 等 FOSS 包和其他数据科学框架来开发和训练新应用程序的模型。
许多 AI 和数据分析软件包(如 JupyterLab)都是 Python、Javascript、HTML、C、C++、Node.js、TypeScript、SQL 和其他语言的复杂混合体。最近,其中一些软件包中捆绑了 Go 和 Rust。这些项目中不需要 Anaconda。conda 工具是免费开源软件 (FOSS),这意味着永远不需要向 Anaconda 付费。
我喜欢的是 CONDA 仅使用 Python 就能让所有功能协同工作。我无需使用复杂的编译过程即可使其运行。
它真的有效!
速度很重要。大小很重要。对 conda 速度慢的抱怨是有道理的,尤其是当涉及到 100 个软件包时。如果不遵循良好的做法,在新的 conda 环境中安装复杂或过时的软件包可能需要几个小时。先做一些前期工作来安装过时或非主流的软件包会很有帮助,这样 conda 就可以确定匹配过时但必要的软件包所需的剩余软件包。
顺序很重要。我最近在尝试重用许多需要 OpenAI v0.28.1 的 AI 包时遇到了顺序问题。OpenAI 发布了其 v1.x 系列 API 重写,这破坏了数百个包,事先没有警告或包含迁移工具。OpenAI 每隔几天就会发布新的重大版本和错误修复。因此,与其在飞机起飞后尝试更换发动机,不如使用稳定的 v0.28.1 生产版本。我们首先通过 conda 安装 OpenAI v0.28.1,然后安装其他所有版本,这在几分钟内以最小的努力解决了问题。他们建议的升级路径需要一个渠道外的 AI 解决方案(“grit”),并拥有用于大规模生产使用的付费商业许可证。现在,OpenAI 有责任为开发人员提供常规的 conda 包来升级他们的产品。在此之前,开发人员可以使用 conda-forge 中的 v0.28.1。顺序很重要,有序性也很重要。“conda search”命令可帮助您确定哪个包可能是您的瓶颈。
为了解决解决复杂 conda 环境的速度问题,我使用了 Mamba。Mamba 是使用我使用的完整 conda 命令集的 conda 核心求解器的 C++ 重写版。Mamba 通常与复杂的 pip 安装一样快。mamba 的错误报告比 pip 更好,它确实会导致灾难性的故障和对 conda 环境的损坏,就像 pip 可能在没有警告的情况下导致的那样。Mamba 现在设置起来可能很棘手,因为它需要单独安装,而且文档还不是很完整。恕我直言,Mamba 安装程序必须作为常规 conda 包提供,而不是作为单独的安装提供。
大多数强大的工具都需要花一点时间才能掌握。我可以用如此少的努力重复使用数百名其他开发人员在如此多的语言中开发出的产品,这仍然让我感到惊讶。