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

Posted

技术标签:

【中文标题】给定 Python 包的名称,要导入的模块的名称是啥?【英文标题】:Given the name of a Python package, what is the name of the module to import?给定 Python 包的名称,要导入的模块的名称是什么? 【发布时间】:2012-07-12 07:45:24 【问题描述】:

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

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

我们做easy_install mysql-python,但导入实际上是import MySQLdb 我们使用easy_install python-memcached,但实际上导入的是import memcache(没有尾随的d)

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

【问题讨论】:

包维护者如何命名包和其中的模块。 【参考方案1】:

很遗憾,这种疯狂没有办法。 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 的 Gem,但缺少一些重要功能(例如,列出包和 upgrading en masse)。具有讽刺意味的是,Pip 本身就是complicated to install。在流行的 64 位 Windows 上安装需要从源代码构建和安装两个包。对于刚接触编程的人来说,这是一个很大的要求。

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

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


Python 3 解决了很多打包问题。那里有aren't any packages for Python 3。

【讨论】:

我当然希望这个答案是半开玩笑的。我一直告诉自己这部分不可能是认真的,但其他部分是正确的...... 在win64上安装pip真的那么糟糕吗?我通常只下载 setuptools 安装程序然后运行easy_install pip。虽然我使用的是 32 位 python,所以也许这就是区别所在。 没错。 64 位 Python 没有 setuptools 安装程序。 “目前,由于 distutils 安装程序兼容性问题,提供的 .exe 安装程序不支持 Windows 的 64 位版本的 Python”。我不鼓励朋友安装 64 位 Python。 pip 可以列出包:使用pip freeze 列出已安装的包,使用pip search 列出在线包(存储在PyPI 上)。 这个答案已经过时了。但是python依赖还是一团糟。【参考方案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().rstrip()
'memcache'

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

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

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

【讨论】:

以上是关于给定 Python 包的名称,要导入的模块的名称是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Python包的导入说明

Python3快速入门——Python包管理

python基础——python添加模块搜索路径和包的导入

PYTHON-DAY18-包 相对 绝对导入

包的相关知识

包的初识和进阶