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

146 投票
13 回答
112738 浏览
提问于 2025-04-15 20:22

Python有没有类似于Ruby的rubygems那样的包管理系统?在Ruby中,你可以通过输入gem install packagename来安装包。

安装Python模块的页面上,我只看到提到python setup.py install,但这需要你先找到那个包。

13 个回答

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

参考资料:

63

为了对比一下,这里还有一个叫做 pip 的东西。

214

最近的进展

2014年3月: 好消息!Python 3.4 现在自带 Pip。Pip 一直以来都是 Python 的标准包管理工具。你可以用下面的方式安装一个包

pip install httpie

太棒了!这是任何 Python 版本中最好的功能。它让社区丰富的库对每个人都可用。新手们不再因为设置的复杂而无法使用社区库。

不过,Python 的打包体验仍然存在一些令人沮丧的问题。总的来说,这些问题让 Python 对新手来说非常不友好。而且,长达14年的忽视(也就是从 Python 2.0 到 Python 3.3 之间没有自带包管理器)对社区造成了伤害。下面我会详细描述这些问题。

突出的问题

重要的是要明白,虽然有经验的用户能找到解决这些问题的方法,但对于新手来说,这些问题是很大的障碍。实际上,困难和不友好的用户体验可能会让很多人望而却步。

PyPI 网站不太友好

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

我们来把它的页面和 RubyGems 以及 Npm(Node 的包管理器)进行比较。

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

你会发现 RubyGems 和 Npm 的页面都以一行描述包开始,然后是大大的、友好的安装说明。

而对于那些天真的 Python 用户来说,浏览 PyPI 可真是个悲剧。在https://pypi.python.org/pypi/simplejson/上,他们找不到任何有用的安装说明。倒是有一个大大的绿色“下载”链接。跟着这个链接下载也不算不合理。于是,他们点击了!浏览器下载了一个 .tar.gz 文件。很多 Windows 用户甚至打不开这个文件,但如果他们坚持下去,可能最终会解压出来,然后运行 setup.py,最后在谷歌的帮助下执行 setup.py install。有些人会放弃,重新发明轮子……

当然,这一切都是错误的。安装包的最简单方法是用 Pip 命令。但 PyPI 甚至没有提到 Pip。相反,它把用户引导到了一个古老而繁琐的路径上。

错误:无法找到 vcvarsall.bat

Numpy 是 Python 最受欢迎的库之一。试着用 Pip 安装它,你会收到这个神秘的错误信息:

错误:无法找到 vcvarsall.bat

解决这个问题是 Stack Overflow 上最受欢迎的问题之一:“错误:无法找到 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?

撰写回答