【发布时间】: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