我知道 pip
是 python 包的包管理器。但是,我在 IPython 的网站上看到安装使用 conda
来安装 IPython。
我可以使用 pip
安装 IPython 吗?当我已经拥有 pip
时,为什么还要使用 conda
作为另一个 python 包管理器?
pip
和 conda
有什么区别?
引用 Conda blog:
涉足python世界这么久,我们都知道pip、easy_install、virtualenv,但是这些工具并不能满足我们所有的具体要求。主要问题是他们专注于 Python,忽略了非 Python 库依赖,例如 HDF5、MKL、LLVM 等,它们的源代码中没有 setup.py,也没有将文件安装到 Python 的站点-包目录。
因此,Conda 是一种打包工具和安装程序,旨在做的不仅仅是 pip
所做的事情;处理 Python 包以及 Python 包本身外部的库依赖项。 Conda 还创建了一个虚拟环境,就像 virtualenv
所做的那样。
因此,或许应该将 Conda 与 Buildout 进行比较,Buildout 是另一个可让您处理 Python 和非 Python 安装任务的工具。
因为 Conda 引入了一种新的打包格式,所以不能互换使用 pip
和 Conda; pip
无法安装 Conda 软件包格式。您可以同时使用这两个工具(通过安装 pip
和 conda 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 是有意义的。
免责声明:这个答案描述了十年前的情况,当时 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 install --use-wheel <package>
将安装一个构建包。请参见此处:wheel.readthedocs.org/en/latest。然而,我对轮子的个人经验是,可用的科学轮子包太少了,它纯粹是学术性的。当然,如果您的构建环境没有完全正确设置,那么 pip install 在 Windows 上通常也不起作用。所以目前,conda ftw。
其他答案对细节进行了公平的描述,但我想强调一些高层次的观点。
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
从。
Keras
,在我的 Mac 上安装了 anaconda,并且 Keras 同时安装了 conda
和 pip
。那么,在终端中运行我的代码时,我如何知道正在导入哪个 keras
(pip
一个或 conda
一个)?
不要进一步混淆你,但你也可以在你的 conda 环境中使用 pip,它验证了上面的一般与 python 特定的经理评论。
conda install -n testenv pip
source activate testenv
pip <pip command>
您还可以将 pip 添加到任何环境的默认包中,这样它每次都存在,因此您不必遵循上述代码段。
fully supported
? fully recommended
暗示,在我看来,在 conda 环境中使用 pip 比 conda 更好,而且我不确定您/他们的意思是什么?
引用来自 Continuum 网站的 Conda for Data Science 文章:
Conda 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
(2021 年更新)
TL;DR 使用 pip,它是 Python 3 以来的官方包管理器。
点子
基本
pip 是 python 的默认包管理器
pip 自 Python 3.0 起内置
用法:python3 -m venv myenv;源 myenv/bin/激活; python3 -m pip 安装请求
软件包从官方公共 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。
包是从 anaconda repo 下载的。
它只安装预编译的包。
Conda 有自己的包格式。它不使用轮子。
conda install 安装一个包。
conda build 来构建一个包。
conda 可以构建 python 解释器(以及它依赖的其他 C 包)。这就是为 anaconda 构建和捆绑解释器的方式。
conda 允许安装和升级 Python 解释器(pip 不允许)。
先进的
从历史上看,conda 的卖点是支持构建和安装二进制包,因为 pip 并不能很好地支持二进制包(直到 wheel 和 manylinux2010 规范)。
强调构建包。 Conda 具有广泛的构建设置,它存储大量元数据,以处理依赖项和构建链。
一些项目使用 conda 来启动复杂的构建系统并生成一个轮子,该轮子发布到 pypi.org 用于 pip。
容易安装/鸡蛋
仅供历史参考。不使用
egg 是一种废弃的包装形式,它一直使用到 2010 年代中期,并完全被轮子取代。
egg 是一个 zip 存档,它包含 python 源文件和/或编译的库。
egg 与 easy_install 和 pip 的第一个版本一起使用。
easy_install 是另一个包管理器,它先于 pip 和 conda。它已在 setuptools v58.3(2021 年)中删除。
它也引起了很多混乱,就像 pip vs conda :D
egg 文件加载缓慢、指定不明确且特定于操作系统。
每个 egg 都设置在一个单独的目录中,导入 mypackage 必须在可能数百个目录中查找 mypackage.py(安装了多少个库?)。这很慢,对文件系统缓存不友好。
从历史上看,上述三个工具都是开源的,并且是用 Python 编写的。然而,conda 背后的公司在 2020 年更新了他们的服务条款以禁止商业使用,请注意!
Funfact:构建 Python 解释器的唯一严格要求的依赖项是 zlib(一个 zip 库),因为压缩是加载更多包所必需的。 Eggs 和 Wheels 包是 zip 文件。
为什么有这么多选择?
一个好问题。
让我们深入了解 Python 和计算机的历史。 =D
纯 python 包在任何这些打包器中都可以正常工作。麻烦不仅在于 Python 包。
世界上的大多数代码都依赖于 C。对于用 C 编写的 Python 解释器来说也是如此。对于许多 Python 包来说也是如此,它们是围绕 C 库或混合 python/C/C++ 代码的项目的 python 包装器。
任何涉及 SSL、压缩、GUI(X11 和 Windows 子系统)、数学库、GPU、CUDA 等的东西通常都与一些 C 代码相结合。
这给打包和分发 Python 库带来了麻烦,因为它不仅仅是可以在任何地方运行的 Python 代码。该库必须经过编译,编译需要编译器和系统库以及第三方库,然后一旦编译,生成的二进制代码仅适用于编译它的特定系统和python版本。
最初,python 可以很好地分发纯 python 库,但很少支持分发二进制库。在 2010 年及前后,您在尝试使用 numpy
或 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 中。
pip
是包管理器。
conda
既是包管理器又是环境管理器。
细节:
https://i.stack.imgur.com/1UKJt.png
依赖检查
Pip 和 conda 在如何实现环境中的依赖关系方面也有所不同。安装包时,pip 在递归的串行循环中安装依赖项。没有努力确保同时满足所有包的依赖关系。这可能会导致环境以微妙的方式被破坏,如果在订单中较早安装的软件包具有不兼容的依赖版本相对于在订单中较晚安装的软件包。相比之下,conda 使用可满足性 (SAT) 求解器来验证是否满足环境中安装的所有软件包的所有要求。此检查可能需要额外的时间,但有助于防止创建损坏的环境。只要有关依赖项的包元数据是正确的,conda 就可以预见地产生工作环境。
参考
了解 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 快得多)。
引自 Conda: Myths and Misconceptions(综合描述):
...
误区三: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 不是竞争对手,而是专注于不同用户群体和使用模式的工具。
对于 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 系统或构建中,依赖规范的多重努力并不是非常 Pythonic,如果所有这些打包“核心”技术都可以通过一种 PEP 收敛,那就太好了)
要回答最初的问题,对于安装包,PIP 和 Conda 是完成同一件事的不同方法。两者都是安装软件包的标准应用程序。主要区别在于包文件的来源。
PIP/PyPI 将有更多的“实验”包,或者更新的、不太常见的包版本
Conda 通常会有更完善的软件包或版本
一个重要的注意事项:如果您使用两个源(pip 和 conda)在同一环境中安装软件包,这可能会在以后引起问题。
重建环境会更难
修复包不兼容变得更加复杂
最佳实践是选择一个应用程序(PIP 或 Conda)来安装包,然后使用该应用程序来安装您需要的任何包。但是,在 conda 环境中仍然使用 pip 有许多例外或原因,反之亦然。例如:
当您需要的软件包仅存在于一个上时,另一个则没有。
您需要仅在一种环境中可用的特定版本
我可以使用 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 有什么区别?
这是其他所有人都广泛回答的问题。
pip
仅适用于 Python
conda
仅适用于 Anaconda + 其他科学软件包,如 R 依赖项等。并非每个人都需要 Python 附带的 Anaconda。 Anaconda 主要面向那些从事机器学习/深度学习等工作的人。休闲 Python 开发人员不会在他的笔记本电脑上运行 Anaconda。
我可能还发现了另一个细微的差别。我的 python 环境在 /usr
而不是 /home
或其他下。为了安装到它,我必须使用 sudo install pip
。对我来说,sudo install pip
的不良副作用与其他地方广泛报道的略有不同:这样做之后,我必须使用 sudo
运行 python
才能导入任何安装了 sudo
的软件包。我放弃了这一点,最终发现我可以使用 sudo conda
将软件包安装到 /usr
下的环境中,然后正常导入,而无需 python
的 sudo
权限。我什至使用 sudo conda
来修复损坏的 pip
而不是使用 sudo pip uninstall pip
或 sudo pip --upgrade install pip
。
pip install
那样简单。