#!/usr/bin/env python # encoding: utf-8 # # Copyright (c) 2009 Doug Hellmann All rights reserved. # """ """ #end_pymotw_header import sys import sys_shelve_importer import imp class NoisyMetaImportFinder(object): def __init__(self, prefix): print 'Creating NoisyMetaImportFinder for %s' % prefix self.prefix = prefix return def find_module(self, fullname, path=None): print 'NoisyMetaImportFinder looking for "%s" with path "%s"' % (fullname, path) name_parts = fullname.split('.') if name_parts and name_parts[0] == self.prefix: print ' ... found prefix, returning loader' return NoisyMetaImportLoader(path) else: print ' ... not the right prefix, cannot load' return None class NoisyMetaImportLoader(object): def __init__(self, path_entry): self.path_entry = path_entry return def load_module(self, fullname): print 'loading %s' % fullname if fullname in sys.modules: mod = sys.modules[fullname] else: mod = sys.modules.setdefault(fullname, imp.new_module(fullname)) # Set a few properties required by PEP 302 mod.__file__ = fullname mod.__name__ = fullname # always looks like a package mod.__path__ = [ 'path-entry-goes-here' ] mod.__loader__ = self mod.__package__ = '.'.join(fullname.split('.')[:-1]) return mod # Install the meta-path finder sys.meta_path.append(NoisyMetaImportFinder('foo')) # Import some modules that are "found" by the meta-path finder print import foo print import foo.bar # Import a module that is not found print try: import bar except ImportError, e: pass