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

kir*_*pit 13 python namespaces pypi cheeseshop

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

包装 ; django-haystack
进口名称 ; 草垛

要么

包装 ; ipython
导入名称 ; IPython的

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

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

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

Wic*_*man 7

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

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


Bra*_*ell 6

车轮

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

>>> 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']
Run Code Online (Sandbox Code Playgroud)

所以setuptools实际上为您提供了三个顶级导入!

点击下载

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

反向查找

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


Sin*_*ion 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)
Run Code Online (Sandbox Code Playgroud)

对于许多包,这将起到很好的作用,但对于反例,请参阅numpy,因为 numpy提供了自己的 distutils,所以我看不出明显的解决方法。

  • 并且 Python 应该在 PyPI 上设置“导入名称”字段!不能那么痛苦……卡住了。 (2认同)
  • 说真的......我已经绞尽脑汁思考如何从导入名称中获取发行版名称。只是目前还没有办法。我曾希望“setup.py”中的“provides”键能够提供此功能。我本来希望能够通过 https://wiki.python.org/moin/PyPIXmlRpc 查询,但没有运气): (2认同)