给定 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 包的名称,要导入的模块的名称是啥?的主要内容,如果未能解决你的问题,请参考以下文章