给定一个Python包的名字,什么是模块导入的名字吗?(Given the name of a Py

2019-06-26 05:32发布

是否有人知道背后的Python的逻辑模块名称VS中的easy_install实际使用的软件包的名称?

几个(其中包括)的例子,似乎有点unlogical对我说:

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

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

Answer 1:

遗憾的是,还有的疯狂没有方法。 在名称包指数是独立的,你的模块名称的import 。 灾难性的一些包共享模块名称 。 如果同时安装,应用程序将与赔率甚至打破。 ( Ruby有这个问题太 )


包装在Python一般是可怕的。 根本原因在于语言没有船只的软件包管理器。 Ruby和船舶的NodeJS与功能齐全的软件包管理器宝石和NPM,并培育周围的GitHub中心共享社区。 NPM使得出版包一样容易安装。 赶到的NodeJS 2009年,已经有14K包 。 久负盛名的Python包指数列出24K。 红宝石宝石列出44K包。

幸运的是,Python的一个体面的包管理器,叫皮普 。 皮普是Ruby的宝石启发,但缺乏一些重要功能(如上市包和升级EN质量 )。 讽刺的是,皮普本身是复杂的安装 。 上流行的64位Windows安装需要构建和从源代码安装这两个包。 这是一个很大的要求,任何人新的节目。

Python的开发者是无知的这一切的挫折,因为他们都是经验丰富的程序员,从源头舒适的建筑,以及他们使用的Linux发行版打包带Python模块。

直到Python中附带的软件包管理器,数以千计的开发人员会无谓地浪费时间重新发明轮子。


Python 3中解决了包装的诸多问题。 有没有为Python 3的任何程序包 。



Answer 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的“一个班轮”:

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

请记住,一些软件包安装多个模块,所以我提出的方法可以返回多个模块的名称。



Answer 3:

pip search mysql

这是良好的阅读太: 为什么要使用PIP过的easy_install?



文章来源: Given the name of a Python package, what is the name of the module to import?