codekingpro/portable-devtools
114k
1 2try:3 # this works on Python < 3.124 from imp import *5 6except ImportError:7 # this is a limited emulation for Python >= 3.12.8 # Note that this is used only for tests or for the old ffi.verify().9 # This is copied from the source code of Python 3.11.10 11 from _imp import (acquire_lock, release_lock,12 is_builtin, is_frozen)13 14 from importlib._bootstrap import _load15 16 from importlib import machinery17 import os18 import sys19 import tokenize20 21 SEARCH_ERROR = 022 PY_SOURCE = 123 PY_COMPILED = 224 C_EXTENSION = 325 PY_RESOURCE = 426 PKG_DIRECTORY = 527 C_BUILTIN = 628 PY_FROZEN = 729 PY_CODERESOURCE = 830 IMP_HOOK = 931 32 def get_suffixes():33 extensions = [(s, 'rb', C_EXTENSION)34 for s in machinery.EXTENSION_SUFFIXES]35 source = [(s, 'r', PY_SOURCE) for s in machinery.SOURCE_SUFFIXES]36 bytecode = [(s, 'rb', PY_COMPILED) for s in machinery.BYTECODE_SUFFIXES]37 return extensions + source + bytecode38 39 def find_module(name, path=None):40 if not isinstance(name, str):41 raise TypeError("'name' must be a str, not {}".format(type(name)))42 elif not isinstance(path, (type(None), list)):43 # Backwards-compatibility44 raise RuntimeError("'path' must be None or a list, "45 "not {}".format(type(path)))46 47 if path is None:48 if is_builtin(name):49 return None, None, ('', '', C_BUILTIN)50 elif is_frozen(name):51 return None, None, ('', '', PY_FROZEN)52 else:53 path = sys.path54 55 for entry in path:56 package_directory = os.path.join(entry, name)57 for suffix in ['.py', machinery.BYTECODE_SUFFIXES[0]]:58 package_file_name = '__init__' + suffix59 file_path = os.path.join(package_directory, package_file_name)60 if os.path.isfile(file_path):61 return None, package_directory, ('', '', PKG_DIRECTORY)62 for suffix, mode, type_ in get_suffixes():63 file_name = name + suffix64 file_path = os.path.join(entry, file_name)65 if os.path.isfile(file_path):66 break67 else:68 continue69 break # Break out of outer loop when breaking out of inner loop.70 else:71 raise ImportError(name, name=name)72 73 encoding = None74 if 'b' not in mode:75 with open(file_path, 'rb') as file:76 encoding = tokenize.detect_encoding(file.readline)[0]77 file = open(file_path, mode, encoding=encoding)78 return file, file_path, (suffix, mode, type_)79 80 def load_dynamic(name, path, file=None):81 loader = machinery.ExtensionFileLoader(name, path)82 spec = machinery.ModuleSpec(name=name, loader=loader, origin=path)83 return _load(spec)84 