如何在Python中找到任何包的“import name”?

时间:2011-08-25 02:10:07

标签: python namespaces pypi cheeseshop

我想知道是否有任何可靠且一致的方法来获取Python包的“import name”/ namespace。例如;

封装; Django的草垛
导入名称;草堆

封装; IPython的
导入名称; IPython的

到目前为止,我知道,PyPi不存储我用PyPiXmlRpc检查过的信息。

我还尝试自动下载软件包,解压缩并挖掘.egg-info,但有些软件包根本没有该文件夹。

任何帮助将不胜感激,并将用于良好的小工具:)

3 个答案:

答案 0 :(得分:6)

轮子

我知道这是一个老问题,但 wheel 包已经被发明了!由于 wheel 只是一个解压缩到lib / site-packages目录中的zip文件,因此检查轮存档的内容可以为您提供顶级导入。

>>> import zipfile
>>> zf = zipfile.ZipFile('setuptools-35.0.2-py2.py3-none-any.whl')
>>> top_level = set([x.split('/')[0] for x in z.namelist()])
>>> # filter out the .dist-info directory
>>> top_level = [x for x in top_level if not x.endswith('.dist-info')]
>>> top_level 
['setuptools', 'pkg_resources', 'easy_install.py']

因此,setuptools实际上为您提供了三个顶级导入!

pip download

pip现在有一个下载命令,所以你可以简单地pip download setuptools(或你喜欢的任何包),然后检查它。

反向查找

不幸的是,我还没有找到一个简单的方法去另一个。也就是说,给定导入名称,包名称是什么。如果您正在查看一些示例代码,或者如果您使用预先安装了一堆软件包并且您想知道实际软件包名称的Anaconda,则可能会出现问题。

答案 1 :(得分:3)

原则上,获取该信息所需的一切都在setup.py中,应该在每个这样的包中。该信息大致是Distribution对象的包,py_modules,ext_package和ext_modules的并集。事实上,这是一个小脚本,只是为了获取该信息而模仿distutils.core.setup

import distutils.core
distutils.core._setup_stop_after = "config"
_real_setup = distutils.core.setup
def _fake_setup(*args, **kwargs):
    global dist
    dist = _real_setup(*args, **kwargs)

distutils.core.setup = _fake_setup

import sys
setup_file = sys.argv[1]
sys.argv[:] = sys.argv[1:]
import os.path
os.chdir(os.path.dirname(setup_file))

execfile(os.path.basename(setup_file))

cat = lambda *seq: sum((i for i in seq if i is not None), [])
pkgs = set(package.split('.')[0] for package
           in cat(dist.packages,
                  dist.py_modules,
                  [m.name for m in cat(dist.ext_modules)],
                  [m.name for m in cat(dist.ext_package)]))

print "\n".join(pkgs)

对于很多软件包来说,这会像魅力一样,但是对于反例,请参阅numpy,它会中断,因为numpy 提供了自己的distutils ,我看不到明显的方法它。

答案 2 :(得分:2)

请注意,您在此处称为包的不是包而是发行版。分发包含零或模块模块或包。这意味着没有一个一对一的分发映射到包。

我不确定是否有办法检测分发版将安装哪些模块和软件包,而不是实际安装它,并为新添加的软件包,模块和pth文件进行内省文件系统更改。