【问题标题】:How to use pkgutil.walk_packages for a zipped package如何将 pkgutil.walk_packages 用于压缩包
【发布时间】:2015-04-17 12:32:43
【问题描述】:

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

我正在使用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

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    它适用于 Python 2.7.5。在 PYTHONPATH 上使用 urwid 作为鸡蛋,它只是一个 .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),
    ...
    

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

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

    【讨论】:

    • 感谢您的回复。我会看看这个。我想我记得 2.7.0 存在问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2019-08-24
    • 2022-12-21
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多