(b) 和上边相同, 使用 __import__() 从指定模块导入特定的名字。
module = __import__('sys',fromlist=['platform']) platform = module.platform print module.modules['sys'] print platform
def importAs(name): return __import__(name) mysys = importAs('sys') print mysys.path
研究 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')