26

我想知道是否有任何可靠且一致的方法来获取 Python 包的“导入名称”/命名空间。例如;

包装;django-haystack
导入名称;草垛

或者

包装;ipython
导入名称;IPython

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

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

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

4

3 回答 3

10

轮子

我知道这是一个古老的问题,但组已经被发明了!由于轮子只是一个解压到 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 zf.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 现在有一个下载命令,所以你可以简单地运行pip download setuptools(或任何你喜欢的包)然后检查它。

反向查找

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

于 2017-05-05T15:40:41.203 回答
7

请注意,这里所说的包不是包,而是分发。一个发行版可以包含零个或多个模块或包。这意味着没有分发到包的一对一映射。

我不确定是否有一种方法可以检测发行版将安装哪些模块和软件包,而不是实际安装它并检查新添加的软件包、模块和 pth 文件的文件系统更改。

于 2011-09-18T12:51:00.557 回答
5

原则上,获取该信息所需的一切都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而中断,我看不出有明显的解决方法。

于 2011-08-25T02:55:41.033 回答