如何将 pkgutil.walk_packages 用于压缩包

Pet*_*ood 5 python python-2.7

我可以在不先解压的情况下找到压缩包中的模块吗?

我正在pkgutil.walk_packages使用importlib.

for _, pkg, _ in pkgutil.walk_packages(package.__path__):
    yield importlib.import_module(pkg)
Run Code Online (Sandbox Code Playgroud)

这在压缩包时不起作用。walk_packages走一条路。

我可以先解压缩包并使用:

for _, pkg, _ in pkgutil.walk_packages(unzipped_package_path):
    yield importlib.import_module(pkg)
Run Code Online (Sandbox Code Playgroud)

但我希望能够在不先解压缩的情况下做到这一点。

pkgutil.getdata使用压缩包,我很惊讶pkgutil.walk_packages没有工作。

我想知道我是否遗漏了什么。

另外,我仅限于 Python 2.7.0

joe*_*ker 0

它适用于 Python 2.7.5。将 urwid 作为一个蛋,它只是 PYTHONPATH 上的一个 .zip 文件:

>>> import pkgutil, urwid
>>> list(pkgutil.walk_packages(urwid.__path__))

[(<zipimporter object "urwid.egg/urwid/">,
  'canvas',
  False),
 (<zipimporter object "urwid.egg/urwid/">,
  'command_map',
  False),
 (<zipimporter object "urwid.egg/urwid/">,
  'compat',
  False),
...
Run Code Online (Sandbox Code Playgroud)

但包名都是相对于urwid. 使用importlib.import_module('urwid.canvas')而不是importlib.import_module('canvas'). pkgutil.walk_packages还将接受prefix='urwid.'关键字参数并将该文本作为输出名称的前缀。

您还应该注意ispkg中的第三个值walk_packages