import sys, imp, ast, compiler, os, parser import codegen class ModuleLoaderHook: __found = set() def __init__(self): ModuleLoaderHook.__found = set() def tracked(self): return list(self.__found) def find_module(self, name, path): try: fullname = name if path: name = name.split('.')[-1] print 'import', name, 'from', path file, filename, _info = imp.find_module(name, path) if file: if path: print 'pkg:', filename, '\t->', fullname else: print 'sys:', filename, '\t->', fullname self.__found.add(filename) if name in ['pprint', 'StringIO']: return None return Loader(file, filename, _info, path) except ImportError: raise except: import traceback; traceback.print_exc() return None #as it was not found class Loader: __modules = {} def __init__(self, file, filename, stuff, path): self.file, self.filename, self.stuff, self.path = file, filename, stuff, path def load_module(self, fullname): mod = None if self.stuff[0] == '.py': # tree = ast.parse(self.file.read(), self.filename, 'single') try: #tree = compiler.parse(self.file.read(), 'exec') #st = parser.suite(self.file.read()) print self.filename tree = ast.parse(self.file.read(), self.filename, 'exec') src = codegen.to_source(tree, add_line_information=False) # print 'src' print src # code = compiler.compile(src, self.filename, 'exec') # exec(code) return tree #mod = tree #print tree #code = compile(tree, '', 'exec') #ctx = {} #exec code in ctx # code = tree.compile('file.py') #raise ImportError # if fullname in Loader.__modules: # mod = Loader.__modules[fullname] # else: # tree = compiler.parse(self.file.read()) # root, filename = os.path.split(self.filename) # module = compiler.pycodegen.Module(tree, fullname) # compiler.misc.set_filename(self.filename, tree) # compiler.syntax.check(tree) # gen = compiler.pycodegen.ModuleCodeGenerator(tree) # # import pprint # # print pprint.pprint(tree) # code = gen.getCode() # mod = eval(code) # Loader.__modules[fullname] = mod # gen = compiler.pycodegen.ModuleCodeGenerator(module) # walk(tree, gen, 1) # if display: # import pprint # print pprint.pprint(tree) # self.code = gen.getCode() #print ast.dump(src).replace('),', '),\n ') # src = codegen.to_source(tree, add_line_information=True) # tree.filename = self.filename # generator = compiler.pycodegen.ModuleCodeGenerator(tree) # mod = generator.getCode() #mod = compiler.compile(src, self.filename, 'exec') except ImportError: import traceback; traceback.print_exc() if mod is None: mod = imp.load_module(fullname, self.file, self.filename, self.stuff) if self.file: self.file.close() mod.__loader__ = self # for introspection return mod loader = ModuleLoaderHook() sys.meta_path.insert(0, loader) import updater import updater2