【问题标题】:zipimporter can't find/load sub-moduleszipimporter 找不到/加载子模块
【发布时间】:2015-04-11 13:07:13
【问题描述】:

我正在尝试从 ZIP 包中加载子模块,但它不起作用。怎么做才对?

foo.zip

foo/
    __init__.py
   bar.py

test.py

import os
import zipimport

dirname = os.path.dirname(__file__)
importer = zipimport.zipimporter(os.path.join(dirname, 'foo.zip'))
print importer.is_package('foo')
print importer.load_module('foo')
print importer.load_module('foo.bar')

输出

$ python test.py
True
<module 'foo' from 'foo.zip/foo/__init__.py'>
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print importer.load_module('foo.bar')
zipimport.ZipImportError: can't find module 'foo.bar'

更新 2015/04/11 06:30 AM PT

以下方法可行,但这是问题的真正解决方案吗? zipimport.zipimporter 文档明确指出“fullname 必须是完全限定(点分)的模块名称。” 并且有一个似乎可以正常工作的 is_package() 方法。

import os
import zipimport

dirname = os.path.dirname(__file__)
importer = zipimport.zipimporter(os.path.join(dirname, 'foo.zip'))

def load_module(name):
    parts = name.split('.')
    module = importer.load_module(parts[0])
    full_name = parts[0]
    for part in parts[1:]:
        full_name += '.' + part
        if not hasattr(module, '__path__'):
            raise ImportError('%s' % full_name)
        path = module.__path__[0]
        module = zipimport.zipimporter(path).load_module(part)

    return module

print load_module('foo.bar')

【问题讨论】:

  • 我想你知道这一点,但如果你只想从 zip 导入而不是获取模块对象,如果你将 zip 文件添加到 PYTHONPATH 并使用import foo.bar.

标签: python python-2.7 import


【解决方案1】:

如果您将importer.load_module('foo.bar') 更改为importer.load_module('foo/bar'),它将加载。我不知道为什么,因为文档上写着

加载模块(全名)

加载全名指定的模块。 fullname 必须是完全限定(带点)的模块名称。它返回导入的模块,如果找不到,则引发 ZipImportError。

【讨论】:

  • 我刚来这里遇到了同样的问题。 5年后。要从 mymodule 中的 program.py 加载,我必须执行 find_module("mymodule\\program")。请注意,前斜杠对我不起作用。当然,我在 Windows 上,但这真的很奇怪,因为 python 通常允许在任何地方使用前斜线。我正在运行 py3.7 并查看 3.7 和 3.9 的文档(没有区别)
  • 刚刚在 linux 上尝试了相同的包。你猜对了,前斜杠不起作用,你需要反斜杠。
  • 哦,不,反过来,Linux 上的正斜杠和 Windows 上的反斜杠。很明显。
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 2021-02-14
  • 2019-01-18
  • 2013-06-10
  • 1970-01-01
  • 2023-03-19
  • 2017-02-17
  • 1970-01-01
相关资源
最近更新 更多