Python是否有包/模块管理系统?

146

Python有类似RubyGems的软件包/模块管理系统吗?就像在Ruby中可以使用“gem install packagename”一样?

安装Python模块页面上,我只看到了对python setup.py install的引用,但这需要您先找到该软件包。


3
如果你认为Python的包索引PyPI应该有更清晰的安装包说明,请在https://bitbucket.org/pypa/pypi/issue/149/package-pages-should-have-clear-pip投票并评论该问题。 - Colonel Panic
虽然这个问题中的链接在当时是最新的,但现在它已经成为了遗留的distutils文档。我提交了http://bugs.python.org/issue26014来解决这些文档需要更清晰地表明它们不再适用于作为终端用户文档使用(它们仅仅是为了工具实现者的利益而保留)。 - ncoghlan
13个回答

214

最近的进展

2014年3月: 好消息!Python 3.4附带了Pip。 Pip长期以来一直是Python的事实标准包管理器。 您可以像这样安装一个软件包

pip install httpie

“Wahey!这是Python发布的任何版本中最好的功能。它使社区丰富的库对每个人都可访问。新手不再因设置的困难而被排除在使用社区库之外。

然而,Python包装体验仍存在一些令人沮丧的问题。总的来说,它们使Python对新手非常不友好。此外,长期忽视(即从Python 2.0到Python 3.3没有提供软件包管理器)对社区造成了伤害。我将两者都描述如下。

令人沮丧的问题

重要的是要理解,虽然有经验的用户能够克服这些问题,但它们对于新手来说是重要的障碍。事实上,困难和一般用户不友好可能会阻止他们中的许多人。

PyPI网站不够友好

每种具有软件包管理器的语言都有一个官方(或准官方)的存储库,供社区下载和发布软件包。 Python拥有Python软件包索引(PyPI)。https://pypi.python.org/pypi

让我们将其页面与RubyGems和Npm(Node软件包管理器)的页面进行比较。

  1. https://rubygems.org/gems/rails 用于包 rails 的 RubyGems 页面
  2. https://www.npmjs.org/package/express 用于包 express 的 Npm 页面
  3. https://pypi.python.org/pypi/simplejson/ 用于包 simplejson 的 PyPI 页面

您会看到 RubyGems 和 Npm 页面都以一个单行描述该软件包的方式开始,然后提供了详细友好的安装说明。

与此同时,对于那些天真地浏览PyPI的Python用户来说,情况就糟糕了。在https://pypi.python.org/pypi/simplejson/上,他们将找不到任何有用的指示。但是,有一个大大的绿色“下载”链接。跟着它也并非毫无道理。啊哈,他们点了!他们的浏览器下载了一个.tar.gz文件。许多Windows用户甚至无法打开它,但如果他们坚持下去,最终可能会解压缩它,然后运行setup.py,最终在Google的帮助下执行setup.py install。一些人会放弃,重新发明轮子...
当然,所有这些都是错误的。最简单的安装软件包的方法是使用Pip命令。但是,PyPI甚至没有提到Pip。相反,它引导他们走上了一条过时而乏味的道路。

错误:无法找到vcvarsall.bat

Numpy是Python最流行的库之一。尝试使用Pip安装它,你会得到这个神秘的错误消息:

错误:无法找到vcvarsall.bat

尝试修复这个问题是 Stack Overflow 上最受欢迎的问题之一:““error: Unable to find vcvarsall.bat””。很少有人能成功解决。
相比之下,在同样的情况下,Ruby 会打印出这条消息,解释了发生了什么以及如何修复它:
请更新您的 PATH 以包含构建工具或从 http://rubyinstaller.org/downloads 下载 DevKit 并按照 http://github.com/oneclick/rubyinstaller/wiki/Development-Kit 中的说明进行操作。
发布软件包很难。
Ruby和Nodejs都配备了功能齐全的软件包管理器Gem(自2007年)和Npm(自2011年),并培育了以GitHub为中心的共享社区。Npm使得发布软件包与安装它们一样容易,它已经拥有64k个软件包。RubyGems列出了72k个软件包。而Python软件包索引只列出了41k个软件包。
历史
Python违背了其“电池包含”的座右铭,直到2014年才提供软件包管理器。
在Pip之前,事实上的标准是一个命令easy_install。它非常不足。没有卸载软件包的命令。
Pip是一个巨大的改进。它拥有大多数Ruby Gem的功能。不幸的是,直到最近,安装Pip却具有讽刺意味的难度。事实上,这个问题仍然是Stack Overflow上最受关注的Python问题之一:“如何在Windows上安装pip?

3
对于任何感兴趣的人,这里PEP 439提出了一种简化pip安装过程的方法,尽管我认为这个PEP只是被考虑的更广泛策略的一部分。在此处还可以参阅讨论here - Cartroo
3
@Cartroo 这是个好消息!Python 应该有一个软件包管理器,我希望开发者们能够实现它。 - Colonel Panic
6
为Python辩护,像Ruby和Node这样的新语言很幸运能够观察以前语言的错误并避免它们。话虽如此,我真的希望Python的软件包管理能够得到更多的关注和关怀,因此我很高兴看到@Cartroo指出了PEP 439。 - Dennis
我认为从(终端用户)的角度来看,Ruby的软件包管理是一件非常好的事情。在所有平台上,“gem install X”似乎都能正常工作。那么,对于需要在Windows上进行C代码编译的宝石,他们是如何做到这一点的呢? - bsa
pip可以通过这里的指南在Windows上(包括64位)轻松安装:http://flask.pocoo.org/docs/installation/#pip-and-distribute-on-windows - ronan_mac
显示剩余5条评论

63

为了进行对比,还有pip

这句话是在讲述与前面提到的技术相对应的一种不同的技术——pip。

2
为什么安装Python模块文档页面上没有提到pip呢? - tommy chheng
请注意,pip不支持egg格式的安装包,它只能安装源代码包。总的来说,与easy_install相比,pip在许多方面做得更好,但是大多数Unix系统默认情况下都会安装easy_install而不是pip。 - Jeffrey Harris
8
@Tommy 正确!如果 Python 开发人员关心用户体验,他们会将 Python 和软件包管理器(例如 pip)一起发布。Ruby 使用 Gem,Nodejs 使用 Npm。https://dev59.com/j3E95IYBdhLWcg3wJKh_#13445719 - Colonel Panic

63

Python包索引(PyPI)似乎是标准的:

  • 安装一个包: pip install MyProject
  • 更新一个包: pip install --upgrade MyProject
  • 指定版本安装一个包:pip install MyProject==1.0

您可以按照以下方式安装包管理器:

curl -O http://python-distribute.org/distribute_setup.py
python distribute_setup.py
easy_install pip

参考资料:


3
这是现代的答案。 - Gringo Suave
6
我在互联网上搜索了20分钟,但没有找到这个答案。非常感谢。另外,如果Python的文档如此糟糕,我对使用它有严重的疑虑......应该将这些信息放在Python主页上或从谷歌等搜索引擎中可以访问到。 - Chris J

21
作为一名Ruby和Perl开发者,并正在学习Python,我发现easy_install或pip并不像RubyGems或CPAN那样容易使用。
我通常会让我的开发系统保持最新版本的模块,当开发人员更新它们时,我会将我的生产系统固定在某个版本。 RubyGems和CPAN都可以通过列出可用的模块来轻松查找模块,然后根据需要单独或批量安装和更新它们。
easy_install和pip使得我能够很容易地安装一个模块,前提是我已经通过浏览器搜索或其他方式了解到它存在。但它们无法告诉我有哪些模块可用。我可以显式地命名要更新的模块,但这些应用程序不会告诉我什么已经被更新,也不会批量更新所有内容(如果我想的话)。
因此,pip和easy_install具备基本功能,但缺少我想要看到的功能,这将使它们更友好、更易于使用,并且与CPAN和RubyGems相媲美。

这个答案现在已经过时了。 - ncoghlan

13

至少有两种工具可用于安装Python第三方模块: easy_install 及其继任者 pip


11
截至至少2014年末,Continuum Analytics' Anaconda Python发行版与conda软件包管理器应被考虑。它解决了人们在一般Python中遇到的大多数严重问题(管理不同的Python版本、更新Python版本、软件包管理、虚拟环境、Windows/Mac兼容性),在一个协同下载中完成。
它让你可以做几乎所有你想要使用Python做的事情,而无需改变系统。我的下一个首选方案是pip + virtualenv,但你必须把virtualenv安装到你的系统Python中(你的系统Python可能不是你想要的版本),或者从源代码构建。Anaconda使整个过程成为一个按钮点击,并添加了其他一些功能。

8

1
如果你想在页面上给每个说“easy_install”的人投反对票,请先检查日期。那是在将近7年前提出的有效建议。我认为我们回答者中没有一个人会定期回顾这个问题进行更新,所以投反对票是愚蠢的。 - Kirk Strauser

6

这个工具叫做setuptools,你可以使用"easy_install"命令来运行它。

你可以在http://pypi.python.org/找到这个目录。


5

我在其他回答中没有看到MacPortsHomebrew的提及,但是因为我在Stack Overflow的相关问题中看到了它们的提及,所以我会加上我的两分钱,许多人似乎认为MacPorts不仅是一个通用软件包管理器(截至今天,他们列出了16311个软件包/端口,其中2931个与“python”匹配,尽管只适用于Mac),而且也是一个不错(也许更好)的Python软件包/模块管理器:

问题

"... Mac python开发者使用的模块管理方法是什么?"

答案

SciPy

"Macs(与Linux不同)没有预装软件包管理器,但有几个流行的软件包管理器可供安装。MacPorts是其中之一......"
"我仍在考虑是否使用MacPorts,但目前我倾向于使用它。"

1
Homebrew本身说:您可以使用(已过时的easy_install或)pip install <your_favorite_package>安装Python包。 - Simone

4
在Windows上安装http://chocolatey.org/,然后执行相关操作。
choco install python

打开一个带有更新 PATH 的新 cmd 窗口。接下来,执行
choco install pip

在那之后,您可以

pip install pyside
pip install ipython
...

我想把这个作为对Thomas Bratt答案的评论来回答,但是我的声望不够... - hansvb

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