给定Python包的名称,要导入的模块的名称是什么?

问题描述 投票:25回答:3

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

一些(以及其他)示例对我来说似乎有些不合逻辑:

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

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

python pip easy-install pypi
3个回答
17
投票

遗憾的是,疯狂没有办法。 package index中的名称与import的模块名称无关。灾难性的some packages share module names。如果您同时安装两者,您的应用程序将以均匀的赔率打破。 (Ruby has this problem too


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

幸运的是,Python有一个不错的包管理器,叫做Pip。 Pip的灵感来自Ruby的宝石,但缺乏一些重要的功能(例如列出包和upgrading en mass)。具有讽刺意味的是,Pip本身就是complicated to install。在流行的64位Windows上安装需要从源代码构建和安装两个软件包。对于任何刚接触编程的人来说,这是一个很大的问

Python的开发人员对所有这些挫败感都一无所知,因为他们是经验丰富的程序员,他们很容易从源代码构建,他们使用Linux发行版和打包的Python模块。

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


Python 3解决了包装的许多问题。有aren't any packages for Python 3


2
投票

与接受的答案不同,它实际上是可能的,尽管确实非常麻烦。

模块名称可以在软件包安装的元数据目录中找到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().strpline()
'memcache'

或者使用等效的bash“one liner”:

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

请记住,有些软件包会安装多个模块,因此我提供的方法可以返回多个模块名称。


0
投票
pip search mysql

这也很好读:Why use pip over easy_install?

© www.soinside.com 2019 - 2024. All rights reserved.