如何将pkgutil.walk_packages用于压缩包

时间:2015-04-17 12:32:43

标签: python python-2.7

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

我正在使用pkgutil.walk_packages检查包并使用importlib取出所有模块。

for _, pkg, _ in pkgutil.walk_packages(package.__path__):
    yield importlib.import_module(pkg)

当压缩包时,这不起作用。 walk_packages走了一条路。

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

来实现
for _, pkg, _ in pkgutil.walk_packages(unzipped_package_path):
    yield importlib.import_module(pkg)

但是我希望能够在不首先解压缩的情况下完成它。

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

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

另外,我仅限于Python 2.7.0

1 个答案:

答案 0 :(得分:0)

它适用于Python 2.7.5。使用urwid作为一个鸡蛋,这只是一个.zip文件,在PYTHONPATH:

>>> 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),
...

但包名称都与urwid有关。使用importlib.import_module('urwid.canvas')代替importlib.import_module('canvas')pkgutil.walk_packages还将接受prefix='urwid.'关键字参数,并将该文本前缀为输出名称。

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