import os import sys import imp class PikeLoader(object): def __init__(self, fullname, module_path): self.target_module_name = fullname self.module_path = module_path def is_package(self, fullname=None): """ :param fullname: Not used, but required for Python 3.4 """ filename = os.path.basename(self.module_path) return filename.startswith('__init__') def augment_module(self, fullname, module): package, _, _ = fullname.rpartition('.') if self.is_package(): module.__path__ = [self.module_path] module.__package__ = fullname else: module.__package__ = package return module def load_module(self, fullname): if self.target_module_name != fullname: raise ImportError('Cannot import module with this loader') if fullname in sys.modules: return sys.modules[fullname] module = self.load_module_by_path(fullname, self.module_path) sys.modules[fullname] = module return module def load_module_by_path(self, module_name, path): _, ext = os.path.splitext(path) module = None # FIXME(jmvrbanac): Get this working properly in PY3 # Python 3 - Try to get the cache filename # if six.PY3: # compiled_filename = imp.cache_from_source(path) # if os.path.exists(compiled_filename): # path, ext = compiled_filename, '.pyc' # if ext.lower() == '.pyc': # module = imp.load_compiled(module_name, path) # elif ext.lower() == '.py': if ext.lower() == '.py': module = imp.load_source(module_name, path) if module: # Make sure we properly fill-in __path__ and __package__ module = self.augment_module(module_name, module) return module