| | 56 | class ModuleLoaderHook(ModuleLoader): |
| | 57 | __caught = set() |
| | 58 | def __init__(self, hooks = None, verbose = False): |
| | 59 | ModuleLoader.__init__(self, hooks, verbose) |
| | 60 | before = filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())) |
| | 61 | for filename in before: |
| | 62 | self.note('Already loaded %s', filename) |
| | 63 | ModuleLoaderHook.__caught = set(before) |
| | 64 | |
| | 65 | def tracked(self): |
| | 66 | return list(self.__caught) |
| | 67 | |
| | 68 | def load_module(self, name, stuff): |
| | 69 | file, filename, info = stuff |
| | 70 | if filename: |
| | 71 | if info[2] == imp.PKG_DIRECTORY: |
| | 72 | filename = filename+os.sep+'__init__.py' |
| | 73 | #DEBUG information, please remove |
| | 74 | if not filename in self.__caught: |
| | 75 | self.note('Caught %s', filename) |
| | 76 | self.__caught.add(filename) |
| | 77 | return ModuleLoader.load_module(self, name, stuff) |
| | 78 | |
| | 79 | class ModuleImporterHook(ModuleImporter): |
| | 80 | def ensure_fromlist(self, m, fromlist, recursive=0): |
| | 81 | try: |
| | 82 | ModuleImporter.ensure_fromlist(self, m, fromlist, recursive) |
| | 83 | except ValueError: |
| | 84 | # It's recommended to fix django to never reach this place |
| | 85 | # and remove this except case, see http://bugs.python.org/issue2090 |
| | 86 | # and related django bugs: #6587 and #6579 |
| | 87 | # XXX: Turn it on to catch empty-name module imports. |
| | 88 | # print 'Importing empty module with __import__:', m.__name__ |
| | 89 | pass |
| | 90 | except ImportError: |
| | 91 | # ihooks catches missing fromlist imports by default |
| | 92 | pass |
| | 93 | |
| | 94 | loader = None |
| | 95 | def hook_imports(verbose=False): |
| | 96 | global loader |
| | 97 | loader = ModuleLoaderHook() |
| | 98 | importer = ModuleImporterHook(loader=loader, verbose=verbose) |
| | 99 | ihooks.install(importer) |
| | 100 | |