| """ |
| Re-implementation of find_module and get_frozen_object |
| from the deprecated imp module. |
| """ |
| |
| import os |
| import importlib.util |
| import importlib.machinery |
| |
| from .py34compat import module_from_spec |
| |
| |
| PY_SOURCE = 1 |
| PY_COMPILED = 2 |
| C_EXTENSION = 3 |
| C_BUILTIN = 6 |
| PY_FROZEN = 7 |
| |
| |
| def find_module(module, paths=None): |
| """Just like 'imp.find_module()', but with package support""" |
| spec = importlib.util.find_spec(module, paths) |
| if spec is None: |
| raise ImportError("Can't find %s" % module) |
| if not spec.has_location and hasattr(spec, 'submodule_search_locations'): |
| spec = importlib.util.spec_from_loader('__init__.py', spec.loader) |
| |
| kind = -1 |
| file = None |
| static = isinstance(spec.loader, type) |
| if spec.origin == 'frozen' or static and issubclass( |
| spec.loader, importlib.machinery.FrozenImporter): |
| kind = PY_FROZEN |
| path = None # imp compabilty |
| suffix = mode = '' # imp compability |
| elif spec.origin == 'built-in' or static and issubclass( |
| spec.loader, importlib.machinery.BuiltinImporter): |
| kind = C_BUILTIN |
| path = None # imp compabilty |
| suffix = mode = '' # imp compability |
| elif spec.has_location: |
| path = spec.origin |
| suffix = os.path.splitext(path)[1] |
| mode = 'r' if suffix in importlib.machinery.SOURCE_SUFFIXES else 'rb' |
| |
| if suffix in importlib.machinery.SOURCE_SUFFIXES: |
| kind = PY_SOURCE |
| elif suffix in importlib.machinery.BYTECODE_SUFFIXES: |
| kind = PY_COMPILED |
| elif suffix in importlib.machinery.EXTENSION_SUFFIXES: |
| kind = C_EXTENSION |
| |
| if kind in {PY_SOURCE, PY_COMPILED}: |
| file = open(path, mode) |
| else: |
| path = None |
| suffix = mode = '' |
| |
| return file, path, (suffix, mode, kind) |
| |
| |
| def get_frozen_object(module, paths=None): |
| spec = importlib.util.find_spec(module, paths) |
| if not spec: |
| raise ImportError("Can't find %s" % module) |
| return spec.loader.get_code(module) |
| |
| |
| def get_module(module, paths, info): |
| spec = importlib.util.find_spec(module, paths) |
| if not spec: |
| raise ImportError("Can't find %s" % module) |
| return module_from_spec(spec) |