为什么要使用pip而不是easy_install?

975

一条推特写道:

不要使用easy_install,除非你喜欢用刀子割自己的脸。使用pip。

为什么要使用pip而不是easy_install?难道不是主要原因在于PyPI和软件包作者吗?如果作者上传了垃圾源码tarball(例如:缺少文件、没有setup.py)到PyPI,则pip和easy_install都将失败。除了外观上的不同,为什么Python人(如上面的推文中所说)似乎强烈支持pip而不是easy_install?

(让我们假设我们谈论的是由社区维护的Distribute软件包中的easy_install)


76
在看到这个问题之前,我回答了一个无关的问题,说“不要使用easy_install,使用pip”。现在我想知道为什么我会这样说...... - Daniel Roseman
22
我仍然遇到一些导致pip失败但easy_install处理得很好的软件包,所以我也很好奇。 - kwatford
5
PyObjC-Core是一个可以使用easy_install工具安装但是不能使用pip工具安装的包的示例。 - Marc Abramowitz
6
四年后再次回到Python,包管理的状况已经一塌糊涂。现在是2014年,而且情况变得更糟了。据我所知,虽然官方Python文档对此毫不知情,但setuptools已经吞并了distutils,但两者都不会成为Python 3的一部分。而pip就像一个第三只轮子一样存在着(说句俏皮话)。 - Andriy Drozdyuk
4
你恰好在最糟糕的时候回来了——就在核心开发人员决定事情变得太混乱,他们不得不介入解决问题之后。 setuptools 不是 Python 3 的一部分,因为只有 pip 是终端用户所需的部分(想要在 PyPI 上进行分发的开发人员可以很明显地使用 pip install setuptools 和其他任何他们可能需要的东西)。 - abarnert
显示剩余5条评论
9个回答

607

来自 Ian Bicking 自己的pip简介

pip 最初是为了在以下方面改进 easy_install 而编写的

  • 所有软件包都在安装之前下载。不会出现部分完成的安装。
  • 在控制台上提供有用的输出信息。
  • 跟踪操作原因。例如,如果正在安装一个软件包,pip 会跟踪该软件包所需的原因。
  • 错误消息应该是有用的。
  • 代码相对简洁且有条理,易于以编程方式使用。
  • 软件包不必作为 egg 存档安装,可以进行平面安装(同时保留 egg 元数据)。
  • 原生支持其他版本控制系统(Git、Mercurial 和 Bazaar)
  • 卸载软件包。
  • 定义固定需求集并可靠地重现一组软件包很简单。

66
“错误信息”的优势非常大,尤其是对于新手用户来说。Easy-install 以喷出几十个看起来像致命错误的方式而闻名,但最终安装却成功了,这使得在学会忽略它所说的大部分内容之前很难使用。Pip则直接省略了这些内容。 - Brandon Rhodes
1
@Glyph,使用easy_install pip相比于sudo apt-get install python-pip有什么优势吗? - Dennis
2
在基于软件包的发行版上,请勿在虚拟环境之外使用easy_install:http://workaround.org/easy-install-debian - Federico
11
当使用 sudo apt-get 命令时,Ubuntu/Debian 会将 Python 包安装在 /usr/lib/python/dist-packages 目录中,而使用 sudo pipsudo easy_install 命令则会安装在 /local/lib/python/site-packages 目录下。不幸的是,Debian/Ubuntu 的包名称通常与 pip 不熟悉的名称不同。在我看来,最好的解决方案是使用 virtualenv 并在其中使用 pip 安装您的软件包。 - Mark Mikofski
2
这需要更新。 - Andriy Drozdyuk
显示剩余4条评论

317
许多答案已经过时,适用于2015年(尽管最初被接受的回答来自Daniel Roseman)。以下是当前情况:
  • 现在二进制包被分发为wheels(.whl文件) - 不仅在PyPI上,而且在第三方存储库中,如Christoph Gohlke's Extension Packages for Windowspip 可以处理wheels;easy_install 不能。
  • 虚拟环境(内置于3.4中,或可以使用 virtualenv 添加到2.6+/3.1+)已成为非常重要和突出的工具(在 官方文档 中推荐);它们默认包含 pip,但与 easy_install 无法正常工作。
  • 包括 easy_installdistribute 包不再维护。其对 setuptools 的改进已合并回 setuptools。尝试安装 distribute 将只安装 setuptools
  • easy_install 本身只是半维护状态。
  • 所有 pip 曾经劣于 easy_install 的情况 - 从未打开过的源树,从 DVCS 存储库等 - 都已经消失了;你可以使用 pip install .pip install git+https://
  • pip 与来自 python.org 的官方 Python 2.7 和 3.4+ 包一起提供,并且在从源代码构建时默认包含 pip 引导程序。
  • 有关安装、使用和构建软件包的各种不完整文档已被 Python Packaging User Guide 取代。 Python 自己关于 安装 Python 模块 的文档现在转而参考此用户指南,并明确将 pip 标记为“首选安装程序”。
  • pip 多年来添加了其他新功能,这些功能永远不会出现在 easy_install 中。例如,pip 通过构建要求文件然后在每个侧面使用单个命令进行安装,使克隆您的站点软件包变得容易。或将您的要求文件转换为本地存储库以用于内部开发。等等。
我所知道的2015年使用easy_install的唯一好理由是,在使用OS X 10.5-10.8的苹果预装Python版本的特殊情况下。自10.5以来,Apple已经包含了easy_install,但是截至10.10,他们仍未包含pip。对于10.9+,您仍应该只使用get-pip.py,但是对于10.5-10.8,这存在一些问题,因此更容易sudo easy_install pip。(通常,easy_install pip是一个不好的主意;只有在OS X 10.5-10.8时才需要这样做。)此外,10.5-10.8以一种easy_install知道如何解决的方式包含readline,但pip不支持,因此如果要升级它,则还需要sudo easy_install readline。

9
@drozzy:也许吧。但请考虑到五年后,我的回答会像其他所有回答一样过时,而丹尼尔·罗斯曼(Daniel Roseman)的回答是永恒的。此外,如果不能依靠一个五年前被接受的答案来展示Python社区在这段时间内为什么支持pip,那么我的回答就不会那么好。 - abarnert
2
值得注意的是,一些打包版本的pip存在缺陷,pip无法升级自身。无论你是否认为这很讽刺,在这种情况下,最简单的解决方案是执行 easy_install -U pipeasy_install3 -U pip - analytik
但是即使使用easy_install,也不能正常工作。虽然这不是我的经验,但我已经有一段时间没有尝试过,因为现在wheels占主导地位。但是Christoph Gohlke的二进制文件曾经被分发为可执行的egg文件。在它们上面调用easy_install是我唯一能够将这些软件包安装到虚拟环境中的方法,而且从来没有给我带来任何困扰。easy_install在什么方面不再与虚拟环境兼容? - jpmc26
需要在“准维护”部分加上引用。否则,回答很棒。 - Gulzar

249

47
信息图表万岁 - WineSoaked
35
另一方面,第二张图已经过时了一年。 distribute将会到达生命周期的尽头,并被distutils2所取代(从Python 3.3开始,它也将成为Python标准库的一部分)。一个名为pysetup的基本安装程序将作为distutils2的一部分提供,pip在未来将继续为distutils2提供额外的功能。 - merwok
7
非常感谢你。我多年来一直对Python打包很困惑,看到有一个半官方的解决方案让我感到振奋。 - aaron
63
截至2013年3月,distribute正在与setuptools合并。 pip可以正常工作。`packaging(即distutils2)未包含在Python 3.3中。 - jfs
22
这个“答案”过时而且显然是错的,不好笑。 - onlynone
显示剩余4条评论

171

可能有两个原因,但不排除还有其他的原因:

  1. pip提供了一个uninstall命令。

  2. 如果安装过程中出现失败,pip将使您处于一个干净的状态。


1
现在setuptools也是这样。嗯……有点像。http://pythonhosted.org/setuptools/easy_install.html#uninstalling-packages - Andriy Drozdyuk

115

REQUIREMENTS文件。

说真的,我每天都与virtualenv一起使用它。


快速依赖管理教程

Requirements文件允许您创建通过pip安装的所有软件包的快照。通过将这些软件包封装在虚拟环境中,您可以使代码库基于非常特定的软件包集工作,并与他人共享该代码库。

来自Heroku文档https://devcenter.heroku.com/articles/python

您可以创建一个虚拟环境,并设置您的shell使用它。(bash/*nix指令)

virtualenv env
source env/bin/activate

现在,使用这个Shell运行的所有Python脚本都会使用该环境的软件包和配置。现在,您可以在本地为此环境安装软件包,而不需要全局安装在您的计算机上。

pip install flask

现在您可以使用以下命令,将已安装的软件包信息转储出来:

pip freeze > requirements.txt

如果您将该文件添加到版本控制中,其他人获取您的代码时可以设置自己的虚拟环境并使用以下命令安装所有依赖项:

pip install -r requirements.txt

任何时候都可以自动化像这样的单调乏味任务是很棒的。


1
这似乎也是 setuptools 的一部分:http://pythonhosted.org/setuptools/setuptools.html#declaring-dependencies - Andriy Drozdyuk
你应该使用 pipreqs 来获取 requirements.txt 文件。它只会提供与调用 pipreqs 的项目相关的库,因此 requirements.txt 将基于该项目而不是虚拟环境。 - SeF

82

pip无法安装二进制软件包并且在Windows上测试不充分。

由于Windows默认没有编译器,因此通常情况下无法使用pip。而easy_install则可以安装Windows的二进制软件包。


3
有意思,我从没想过。另外,pip也不支持setuptools中的“extras”功能,这在至少Zope用户中被使用。 - Sridhar Ratnakumar
18
在Windows上使用的“正确”编译器是Visual Studio(对于Python的最新版本,我认为是2008)。即使是免费版本的安装也很麻烦。在Windows上安装C扩展的正常方法是使用预编译的二进制文件。easy_install支持此功能,pip则不支持。 - fuzzyman
1
你可以通过安装mingw32和配置distutils来在Windows上使用gcc。由于C运行时版本不匹配,因此并非所有东西都可用(例如文件描述符会有所不同)。 - fuzzyman
8
这就是我仍然使用easy_install的主要原因。 - Randy Syring
14
自从给出上述回答以来的这几年里,pip在Windows或其他平台上安装二进制包不再是不可能的了。采用“wheel”二进制分发格式可以实现这一点。许多带有C扩展模块的第三方包现在也被作为为各种平台构建的wheel分发,并且pip可以自动安装它们。例如,请参见http://pythonwheels.com。 - Ned Deily
显示剩余3条评论

76

5
为什么没有更多人点赞?这些答案已经过时了! - Andriy Drozdyuk
5
是的,最佳答案已经过时了。 - WKordos
2
因此,easy_install和pip现在或多或少处于平等地位。这是无稽之谈。easy_install仍然是长期以来的样子,而pip则在其基础上有了巨大的改进。easy_install只是setuptools的一部分,可以说是最糟糕的部分之一,这就是为什么pip旨在取代它的原因。 - Piotr Dobrogost

25

作为对fuzzyman回复的补充:

pip不会安装二进制包,在Windows上也没有经过充分测试。

由于Windows默认情况下没有编译器,因此通常无法使用pip。easy_install可以安装Windows的二进制软件包。

以下是Windows上的技巧:

  • 您可以使用easy_install<package>来安装二进制软件包,以避免构建二进制文件

  • 即使您已经使用了easy_install,您也可以使用pip uninstall <package>来卸载软件包。

这只是一个适用于我在Windows上的解决方案。 如果没有涉及二进制文件,我通常仍然使用pip。

请参阅当前的pip文档:http://www.pip-installer.org/en/latest/other-tools.html#pip-compared-to-easy-install

我将在邮件列表上询问计划是什么。

这里是最新的更新:

安装二进制文件的新支持方式将是wheel ! 尽管还没有成为标准,但已接近标准。当前版本仍是alpha:1.0.0a1

https://pypi.python.org/pypi/wheel

http://wheel.readthedocs.org/en/latest/

我将使用wheel 创建PySide 的OS X安装程序来测试。wheel 代替蛋。会回来报道。

干杯 - Chris

快速更新:

过渡到wheel 即将结束。大多数软件包都支持wheel

我曾承诺为PySide构建轮子,去年夏天我完成了。效果很好!

提示: 到目前为止,一些开发人员未能支持轮子格式,仅因为他们忘记用setuptools替换distutils。 通常,只需在setup.py中替换这个单词即可轻松转换这样的包。


2
更新如上 - 我想等待即将结束了;-) - Christian Tismer
我应该再次更新这个,因为wheel已经成为2014年春季的标准。实际上,我认为这样的旧帖子不应该无限制地更改,因为
  • 旧回答非常好
  • 当现实发生变化时,替换所有内容很容易。但是,当问题的原始原因消失时,这样做是否公平?
- Christian Tismer

3

我遇到了一个特殊情况,必须使用easy_install而不是pip,否则我必须直接拉取源代码。

对于GitPython包,pip中的版本太旧了,只有0.1.7,而easy_install中的版本是最新的,即0.3.2.rc1

我正在使用Python 2.7.8。我不确定easy_installpip的底层机制,但至少一些软件包的版本可能会不同,有时easy_install是具有更新版本的那个。

easy_install GitPython

6
我现在刚检查了一下(请看时间戳),这个信息已经不再正确:pip和easy_install的效果是相同的,今天GitPython 0.3.5的版本都可以安装。(只在OS X Yosemite上进行了测试)。你用的是哪个操作系统平台?请更新你的内容,因为它现在会导致误解。 - Christian Tismer
在我的电脑上,我无法使用PIP,因为无论尝试什么设置,它仍然会抛出关于代理的网络错误。但是我在使用easy_install时没有任何问题。 - RAY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接