有人知道Python模块名称与easy_install中实际使用的包名称之间的逻辑关系吗?
我举了几个(在其他例子中)似乎有点不合逻辑的例子:
导入实际上是import MySQLdb
easy_install python-memcached,但导入实际上是import memcache (没有尾随的d)我没有找到一种一致的方法来找到等价性。对于一些模块,我花了很多时间才找到它。我做错了什么?
发布于 2012-07-12 22:24:20
令人遗憾的是,目前还没有疯狂的方法。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的开发人员对所有这些挫折一无所知,因为他们是经验丰富的程序员,喜欢从头开始构建,而且他们使用Linux发行版和打包的Python模块。
在Python发布包管理器之前,数以千计的开发人员将不必要地浪费时间重新发明轮子。
Python3解决了许多打包问题。好了,aren't any packages for Python 3。
发布于 2019-02-24 22:50:56
与公认的答案不同,这实际上是可能的,尽管确实相当繁琐。
模块名称可以在软件包安装的元数据目录中的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 "one liner":
cat $(python -c "import pkg_resources; \
print(pkg_resources.get_distribution('python-memcached').egg_info)")/top_level.txt请记住,有些包安装了多个模块,因此我介绍的方法可以返回多个模块名称。
https://stackoverflow.com/questions/11453866
复制相似问题