(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 年及前后,您在尝试使用 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 中。