40

有人知道 Python 模块名称背后的逻辑与 easy_install 中使用的实际包的名称吗?

一些(除其他外)对我来说似乎有点不合逻辑的例子:

  • 我们有easy_install mysql-python,但进口实际上是import MySQLdb
  • 我们这样做easy_install python-memcached了,但实际上是导入import memcache(没有尾随 d)

我没有找到一种一致的方法来找到等价物。对于某些模块,我花了很多时间浏览才能找到它。我究竟做错了什么?

4

2 回答 2

20

遗憾的是,这种疯狂是没有办法的。包索引中的名称与您的模块名称无关import。灾难性地,一些包共享模块名称。如果您同时安装两者,您的应用程序将以偶数赔率中断。(Ruby也有这个问题


Python 中的打包通常是可怕的。根本原因是该语言没有包管理器。Ruby 和 Nodejs 附带功能齐全的包管理器 Gem 和 Npm,并培育了以 GitHub 为中心的共享社区。Npm 使发布包就像安装它们一样简单。Nodejs 于 2009 年问世,已经有14k 个包。古老的 Python 包索引列出了 24k。Ruby Gems 列出了 44k 包。

幸运的是,有一个不错的 Python 包管理器,称为Pip。Pip 受到 Ruby 的 Gem 的启发,但缺少一些重要的功能(例如,列出包和整体升级)。具有讽刺意味的是,Pip 本身安装起来很复杂。在流行的 64 位 Windows 上安装需要从源代码构建和安装两个包。对于刚接触编程的人来说,这是一个很大的要求。

Python 的开发人员对所有这些挫折一无所知,因为他们是经验丰富的程序员,可以从源代码构建,并且他们使用带有打包 Python 模块的 Linux 发行版。

在 Python 附带包管理器之前,成千上万的开发人员将不必要地浪费时间重新发明轮子。


Python 3 解决了很多打包问题。Python 3没有任何软件包

于 2012-07-12T14:24:19.590 回答
14

与公认的答案不同,这实际上是可能的,尽管确实很麻烦。

模块名称可以top_level.txt在包安装的元数据目录中找到。

要使用 python 访问它(替换python-memcached为您的包名称):

>>> import pkg_resources as pkg # included in setuptools package
>>> metadata_dir = pkg.get_distribution('python-memcached').egg_info
>>> open('%s/%s' % (metadata_dir, 'top_level.txt')).read().rstrip()
'memcache'

或者使用等效的 bash “一个衬里”:

cat $(python -c "import pkg_resources; \
print(pkg_resources.get_distribution('python-memcached').egg_info)")/top_level.txt

请记住,某些软件包安装了多个模块,因此我介绍的方法可以返回多个模块名称。

于 2019-02-24T14:50:55.847 回答