| Viewing file:  _imp.py (2.38 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
"""Re-implementation of find_module and get_frozen_object
 from the deprecated imp module.
 """
 
 import importlib.machinery
 import importlib.util
 import os
 import tokenize
 from importlib.util import module_from_spec
 
 PY_SOURCE = 1
 PY_COMPILED = 2
 C_EXTENSION = 3
 C_BUILTIN = 6
 PY_FROZEN = 7
 
 
 def find_spec(module, paths):
 finder = (
 importlib.machinery.PathFinder().find_spec
 if isinstance(paths, list)
 else importlib.util.find_spec
 )
 return finder(module, paths)
 
 
 def find_module(module, paths=None):
 """Just like 'imp.find_module()', but with package support"""
 spec = find_spec(module, paths)
 if spec is None:
 raise ImportError(f"Can't find {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 compatibility
 elif (
 spec.origin == 'built-in'
 or static
 and issubclass(spec.loader, importlib.machinery.BuiltinImporter)
 ):
 kind = C_BUILTIN
 path = None  # imp compabilty
 suffix = mode = ''  # imp compatibility
 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
 file = tokenize.open(path)
 elif suffix in importlib.machinery.BYTECODE_SUFFIXES:
 kind = PY_COMPILED
 file = open(path, 'rb')
 elif suffix in importlib.machinery.EXTENSION_SUFFIXES:
 kind = C_EXTENSION
 
 else:
 path = None
 suffix = mode = ''
 
 return file, path, (suffix, mode, kind)
 
 
 def get_frozen_object(module, paths=None):
 spec = find_spec(module, paths)
 if not spec:
 raise ImportError(f"Can't find {module}")
 return spec.loader.get_code(module)
 
 
 def get_module(module, paths, info):
 spec = find_spec(module, paths)
 if not spec:
 raise ImportError(f"Can't find {module}")
 return module_from_spec(spec)
 
 |