12–5. 使用 __import__().
(a) 使用 __import__ 把一个模块导入到你的名称空间。 你最后使用了什么样的语法?
12–6. 扩展导入。创建一个 importAs() 函数. 这个函数可以把一个模块导入到你的名称空间, 但使用你指定的名字, 而不是原始名字。 例如, 调用 newname=importAs('mymodule') 会导入mymodule , 但模块和它的所有元素都通过新名称 newname 或 newname.attr 访问。 这是 Python2.0 引入的扩展导入实现的功能。
12–7. 导入钩子。
(a) 使用 __import__ 把一个模块导入到你的名称空间。 你最后使用了什么样的语法?
(b) 和上边相同, 使用 __import__() 从指定模块导入特定的名字。
module = __import__('sys',fromlist=['platform'])
platform = module.platform
print module.modules['sys']
print platform
12–6. 扩展导入。创建一个 importAs() 函数. 这个函数可以把一个模块导入到你的名称空间, 但使用你指定的名字, 而不是原始名字。 例如, 调用 newname=importAs('mymodule') 会导入mymodule , 但模块和它的所有元素都通过新名称 newname 或 newname.attr 访问。 这是 Python2.0 引入的扩展导入实现的功能。
def importAs(name):
return __import__(name)
mysys = importAs('sys')
print mysys.path
12–7. 导入钩子。
研究 PEP 302 的导入钩子机制. 实现你自己的导入机制, 允许编码你的模块(encryption, bzip2, rot13, 等), 这样解释器会自动解码它们并正确导入。你可以参看 zip文件导入的实现 (参阅 第 12.5.7 节)。
不会做,下面代码瞎写的。先自己创建一个zzz.tar.bz2压缩包,里面包含一些普通py文件和一个__init__.py文件,__init__.py文件里定义一个__all__=[]列表包含其他py文件。然后用下面的类来导入bz2格式的压缩包里的模块。
import imp
import sys,os
import tarfile
def decompressbz2(bz2file,dstdir):
archive=tarfile.open(bz2file,'r:bz2')
for tarinfo in archive:
archive.extract(tarinfo,dstdir)
archive.close()
return bz2file[:-8]
class bz2Importer(object):
def __init__(self,name,decompress):
wp=os.getcwd()
self.last_fullname = decompress(name,wp)
self.last_text = ''
self.last_ispkg = False
def find_module(self, fullname, path=None):
wp=os.getcwd()
moduledir=wp+os.sep+self.last_fullname
if not fullname.endswith('.py'):
fullname += '.py'
if fullname in sys.modules:
return self
elif fullname in os.listdir(moduledir):
if self.load_module(fullname) and fullname in sys.modules:
return self
else:
return None
else:
return None
def load_module(self, fullname):
if fullname in sys.modules:
return sys.modules[fullname]
try:
code = self.last_text
ispkg = self.last_ispkg
mod = sys.modules.setdefault(fullname, imp.new_module(fullname))
mod.__file__ = "<MyImport: %s>" % fullname
mod.__loader__ = self
if ispkg:
mod.__path__ = []
mod.__package__ = fullname
else:
mod.__package__ = fullname.rpartition('.')[0]
co = compile(code, mod.__file__, 'exec')
exec(co, mod.__dict__)
return mod
except Exception as e:
raise ImportError(e)
sys.meta_path.append(bz2Importer('zzz.tar.bz2',decompressbz2))
importer=bz2Importer('zzz.tar.bz2',decompressbz2)
print 'test1.py : ', importer.find_module('test1')
print 'xxx.py : ', importer.find_module('xxx')