17db96d56Sopenharmony_ci"""This module provides the components needed to build your own __import__ 27db96d56Sopenharmony_cifunction. Undocumented functions are obsolete. 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ciIn most cases it is preferred you consider using the importlib module's 57db96d56Sopenharmony_cifunctionality over this module. 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci""" 87db96d56Sopenharmony_ci# (Probably) need to stay in _imp 97db96d56Sopenharmony_cifrom _imp import (lock_held, acquire_lock, release_lock, 107db96d56Sopenharmony_ci get_frozen_object, is_frozen_package, 117db96d56Sopenharmony_ci init_frozen, is_builtin, is_frozen, 127db96d56Sopenharmony_ci _fix_co_filename, _frozen_module_names) 137db96d56Sopenharmony_citry: 147db96d56Sopenharmony_ci from _imp import create_dynamic 157db96d56Sopenharmony_ciexcept ImportError: 167db96d56Sopenharmony_ci # Platform doesn't support dynamic loading. 177db96d56Sopenharmony_ci create_dynamic = None 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_cifrom importlib._bootstrap import _ERR_MSG, _exec, _load, _builtin_from_name 207db96d56Sopenharmony_cifrom importlib._bootstrap_external import SourcelessFileLoader 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_cifrom importlib import machinery 237db96d56Sopenharmony_cifrom importlib import util 247db96d56Sopenharmony_ciimport importlib 257db96d56Sopenharmony_ciimport os 267db96d56Sopenharmony_ciimport sys 277db96d56Sopenharmony_ciimport tokenize 287db96d56Sopenharmony_ciimport types 297db96d56Sopenharmony_ciimport warnings 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ciwarnings.warn("the imp module is deprecated in favour of importlib and slated " 327db96d56Sopenharmony_ci "for removal in Python 3.12; " 337db96d56Sopenharmony_ci "see the module's documentation for alternative uses", 347db96d56Sopenharmony_ci DeprecationWarning, stacklevel=2) 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci# DEPRECATED 377db96d56Sopenharmony_ciSEARCH_ERROR = 0 387db96d56Sopenharmony_ciPY_SOURCE = 1 397db96d56Sopenharmony_ciPY_COMPILED = 2 407db96d56Sopenharmony_ciC_EXTENSION = 3 417db96d56Sopenharmony_ciPY_RESOURCE = 4 427db96d56Sopenharmony_ciPKG_DIRECTORY = 5 437db96d56Sopenharmony_ciC_BUILTIN = 6 447db96d56Sopenharmony_ciPY_FROZEN = 7 457db96d56Sopenharmony_ciPY_CODERESOURCE = 8 467db96d56Sopenharmony_ciIMP_HOOK = 9 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_cidef new_module(name): 507db96d56Sopenharmony_ci """**DEPRECATED** 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci Create a new module. 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci The module is not entered into sys.modules. 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_ci """ 577db96d56Sopenharmony_ci return types.ModuleType(name) 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_cidef get_magic(): 617db96d56Sopenharmony_ci """**DEPRECATED** 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci Return the magic number for .pyc files. 647db96d56Sopenharmony_ci """ 657db96d56Sopenharmony_ci return util.MAGIC_NUMBER 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_cidef get_tag(): 697db96d56Sopenharmony_ci """Return the magic tag for .pyc files.""" 707db96d56Sopenharmony_ci return sys.implementation.cache_tag 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_cidef cache_from_source(path, debug_override=None): 747db96d56Sopenharmony_ci """**DEPRECATED** 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci Given the path to a .py file, return the path to its .pyc file. 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci The .py file does not need to exist; this simply returns the path to the 797db96d56Sopenharmony_ci .pyc file calculated as if the .py file were imported. 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci If debug_override is not None, then it must be a boolean and is used in 827db96d56Sopenharmony_ci place of sys.flags.optimize. 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci If sys.implementation.cache_tag is None then NotImplementedError is raised. 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci """ 877db96d56Sopenharmony_ci with warnings.catch_warnings(): 887db96d56Sopenharmony_ci warnings.simplefilter('ignore') 897db96d56Sopenharmony_ci return util.cache_from_source(path, debug_override) 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_cidef source_from_cache(path): 937db96d56Sopenharmony_ci """**DEPRECATED** 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci Given the path to a .pyc. file, return the path to its .py file. 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci The .pyc file does not need to exist; this simply returns the path to 987db96d56Sopenharmony_ci the .py file calculated to correspond to the .pyc file. If path does 997db96d56Sopenharmony_ci not conform to PEP 3147 format, ValueError will be raised. If 1007db96d56Sopenharmony_ci sys.implementation.cache_tag is None then NotImplementedError is raised. 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci """ 1037db96d56Sopenharmony_ci return util.source_from_cache(path) 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_cidef get_suffixes(): 1077db96d56Sopenharmony_ci """**DEPRECATED**""" 1087db96d56Sopenharmony_ci extensions = [(s, 'rb', C_EXTENSION) for s in machinery.EXTENSION_SUFFIXES] 1097db96d56Sopenharmony_ci source = [(s, 'r', PY_SOURCE) for s in machinery.SOURCE_SUFFIXES] 1107db96d56Sopenharmony_ci bytecode = [(s, 'rb', PY_COMPILED) for s in machinery.BYTECODE_SUFFIXES] 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci return extensions + source + bytecode 1137db96d56Sopenharmony_ci 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ciclass NullImporter: 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_ci """**DEPRECATED** 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci Null import object. 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci """ 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci def __init__(self, path): 1247db96d56Sopenharmony_ci if path == '': 1257db96d56Sopenharmony_ci raise ImportError('empty pathname', path='') 1267db96d56Sopenharmony_ci elif os.path.isdir(path): 1277db96d56Sopenharmony_ci raise ImportError('existing directory', path=path) 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci def find_module(self, fullname): 1307db96d56Sopenharmony_ci """Always returns None.""" 1317db96d56Sopenharmony_ci return None 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ciclass _HackedGetData: 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci """Compatibility support for 'file' arguments of various load_*() 1377db96d56Sopenharmony_ci functions.""" 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci def __init__(self, fullname, path, file=None): 1407db96d56Sopenharmony_ci super().__init__(fullname, path) 1417db96d56Sopenharmony_ci self.file = file 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci def get_data(self, path): 1447db96d56Sopenharmony_ci """Gross hack to contort loader to deal w/ load_*()'s bad API.""" 1457db96d56Sopenharmony_ci if self.file and path == self.path: 1467db96d56Sopenharmony_ci # The contract of get_data() requires us to return bytes. Reopen the 1477db96d56Sopenharmony_ci # file in binary mode if needed. 1487db96d56Sopenharmony_ci if not self.file.closed: 1497db96d56Sopenharmony_ci file = self.file 1507db96d56Sopenharmony_ci if 'b' not in file.mode: 1517db96d56Sopenharmony_ci file.close() 1527db96d56Sopenharmony_ci if self.file.closed: 1537db96d56Sopenharmony_ci self.file = file = open(self.path, 'rb') 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci with file: 1567db96d56Sopenharmony_ci return file.read() 1577db96d56Sopenharmony_ci else: 1587db96d56Sopenharmony_ci return super().get_data(path) 1597db96d56Sopenharmony_ci 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ciclass _LoadSourceCompatibility(_HackedGetData, machinery.SourceFileLoader): 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ci """Compatibility support for implementing load_source().""" 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_cidef load_source(name, pathname, file=None): 1677db96d56Sopenharmony_ci loader = _LoadSourceCompatibility(name, pathname, file) 1687db96d56Sopenharmony_ci spec = util.spec_from_file_location(name, pathname, loader=loader) 1697db96d56Sopenharmony_ci if name in sys.modules: 1707db96d56Sopenharmony_ci module = _exec(spec, sys.modules[name]) 1717db96d56Sopenharmony_ci else: 1727db96d56Sopenharmony_ci module = _load(spec) 1737db96d56Sopenharmony_ci # To allow reloading to potentially work, use a non-hacked loader which 1747db96d56Sopenharmony_ci # won't rely on a now-closed file object. 1757db96d56Sopenharmony_ci module.__loader__ = machinery.SourceFileLoader(name, pathname) 1767db96d56Sopenharmony_ci module.__spec__.loader = module.__loader__ 1777db96d56Sopenharmony_ci return module 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ciclass _LoadCompiledCompatibility(_HackedGetData, SourcelessFileLoader): 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci """Compatibility support for implementing load_compiled().""" 1837db96d56Sopenharmony_ci 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_cidef load_compiled(name, pathname, file=None): 1867db96d56Sopenharmony_ci """**DEPRECATED**""" 1877db96d56Sopenharmony_ci loader = _LoadCompiledCompatibility(name, pathname, file) 1887db96d56Sopenharmony_ci spec = util.spec_from_file_location(name, pathname, loader=loader) 1897db96d56Sopenharmony_ci if name in sys.modules: 1907db96d56Sopenharmony_ci module = _exec(spec, sys.modules[name]) 1917db96d56Sopenharmony_ci else: 1927db96d56Sopenharmony_ci module = _load(spec) 1937db96d56Sopenharmony_ci # To allow reloading to potentially work, use a non-hacked loader which 1947db96d56Sopenharmony_ci # won't rely on a now-closed file object. 1957db96d56Sopenharmony_ci module.__loader__ = SourcelessFileLoader(name, pathname) 1967db96d56Sopenharmony_ci module.__spec__.loader = module.__loader__ 1977db96d56Sopenharmony_ci return module 1987db96d56Sopenharmony_ci 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_cidef load_package(name, path): 2017db96d56Sopenharmony_ci """**DEPRECATED**""" 2027db96d56Sopenharmony_ci if os.path.isdir(path): 2037db96d56Sopenharmony_ci extensions = (machinery.SOURCE_SUFFIXES[:] + 2047db96d56Sopenharmony_ci machinery.BYTECODE_SUFFIXES[:]) 2057db96d56Sopenharmony_ci for extension in extensions: 2067db96d56Sopenharmony_ci init_path = os.path.join(path, '__init__' + extension) 2077db96d56Sopenharmony_ci if os.path.exists(init_path): 2087db96d56Sopenharmony_ci path = init_path 2097db96d56Sopenharmony_ci break 2107db96d56Sopenharmony_ci else: 2117db96d56Sopenharmony_ci raise ValueError('{!r} is not a package'.format(path)) 2127db96d56Sopenharmony_ci spec = util.spec_from_file_location(name, path, 2137db96d56Sopenharmony_ci submodule_search_locations=[]) 2147db96d56Sopenharmony_ci if name in sys.modules: 2157db96d56Sopenharmony_ci return _exec(spec, sys.modules[name]) 2167db96d56Sopenharmony_ci else: 2177db96d56Sopenharmony_ci return _load(spec) 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_cidef load_module(name, file, filename, details): 2217db96d56Sopenharmony_ci """**DEPRECATED** 2227db96d56Sopenharmony_ci 2237db96d56Sopenharmony_ci Load a module, given information returned by find_module(). 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ci The module name must include the full package name, if any. 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci """ 2287db96d56Sopenharmony_ci suffix, mode, type_ = details 2297db96d56Sopenharmony_ci if mode and (not mode.startswith('r') or '+' in mode): 2307db96d56Sopenharmony_ci raise ValueError('invalid file open mode {!r}'.format(mode)) 2317db96d56Sopenharmony_ci elif file is None and type_ in {PY_SOURCE, PY_COMPILED}: 2327db96d56Sopenharmony_ci msg = 'file object required for import (type code {})'.format(type_) 2337db96d56Sopenharmony_ci raise ValueError(msg) 2347db96d56Sopenharmony_ci elif type_ == PY_SOURCE: 2357db96d56Sopenharmony_ci return load_source(name, filename, file) 2367db96d56Sopenharmony_ci elif type_ == PY_COMPILED: 2377db96d56Sopenharmony_ci return load_compiled(name, filename, file) 2387db96d56Sopenharmony_ci elif type_ == C_EXTENSION and load_dynamic is not None: 2397db96d56Sopenharmony_ci if file is None: 2407db96d56Sopenharmony_ci with open(filename, 'rb') as opened_file: 2417db96d56Sopenharmony_ci return load_dynamic(name, filename, opened_file) 2427db96d56Sopenharmony_ci else: 2437db96d56Sopenharmony_ci return load_dynamic(name, filename, file) 2447db96d56Sopenharmony_ci elif type_ == PKG_DIRECTORY: 2457db96d56Sopenharmony_ci return load_package(name, filename) 2467db96d56Sopenharmony_ci elif type_ == C_BUILTIN: 2477db96d56Sopenharmony_ci return init_builtin(name) 2487db96d56Sopenharmony_ci elif type_ == PY_FROZEN: 2497db96d56Sopenharmony_ci return init_frozen(name) 2507db96d56Sopenharmony_ci else: 2517db96d56Sopenharmony_ci msg = "Don't know how to import {} (type code {})".format(name, type_) 2527db96d56Sopenharmony_ci raise ImportError(msg, name=name) 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_cidef find_module(name, path=None): 2567db96d56Sopenharmony_ci """**DEPRECATED** 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci Search for a module. 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci If path is omitted or None, search for a built-in, frozen or special 2617db96d56Sopenharmony_ci module and continue search in sys.path. The module name cannot 2627db96d56Sopenharmony_ci contain '.'; to search for a submodule of a package, pass the 2637db96d56Sopenharmony_ci submodule name and the package's __path__. 2647db96d56Sopenharmony_ci 2657db96d56Sopenharmony_ci """ 2667db96d56Sopenharmony_ci if not isinstance(name, str): 2677db96d56Sopenharmony_ci raise TypeError("'name' must be a str, not {}".format(type(name))) 2687db96d56Sopenharmony_ci elif not isinstance(path, (type(None), list)): 2697db96d56Sopenharmony_ci # Backwards-compatibility 2707db96d56Sopenharmony_ci raise RuntimeError("'path' must be None or a list, " 2717db96d56Sopenharmony_ci "not {}".format(type(path))) 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci if path is None: 2747db96d56Sopenharmony_ci if is_builtin(name): 2757db96d56Sopenharmony_ci return None, None, ('', '', C_BUILTIN) 2767db96d56Sopenharmony_ci elif is_frozen(name): 2777db96d56Sopenharmony_ci return None, None, ('', '', PY_FROZEN) 2787db96d56Sopenharmony_ci else: 2797db96d56Sopenharmony_ci path = sys.path 2807db96d56Sopenharmony_ci 2817db96d56Sopenharmony_ci for entry in path: 2827db96d56Sopenharmony_ci package_directory = os.path.join(entry, name) 2837db96d56Sopenharmony_ci for suffix in ['.py', machinery.BYTECODE_SUFFIXES[0]]: 2847db96d56Sopenharmony_ci package_file_name = '__init__' + suffix 2857db96d56Sopenharmony_ci file_path = os.path.join(package_directory, package_file_name) 2867db96d56Sopenharmony_ci if os.path.isfile(file_path): 2877db96d56Sopenharmony_ci return None, package_directory, ('', '', PKG_DIRECTORY) 2887db96d56Sopenharmony_ci for suffix, mode, type_ in get_suffixes(): 2897db96d56Sopenharmony_ci file_name = name + suffix 2907db96d56Sopenharmony_ci file_path = os.path.join(entry, file_name) 2917db96d56Sopenharmony_ci if os.path.isfile(file_path): 2927db96d56Sopenharmony_ci break 2937db96d56Sopenharmony_ci else: 2947db96d56Sopenharmony_ci continue 2957db96d56Sopenharmony_ci break # Break out of outer loop when breaking out of inner loop. 2967db96d56Sopenharmony_ci else: 2977db96d56Sopenharmony_ci raise ImportError(_ERR_MSG.format(name), name=name) 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_ci encoding = None 3007db96d56Sopenharmony_ci if 'b' not in mode: 3017db96d56Sopenharmony_ci with open(file_path, 'rb') as file: 3027db96d56Sopenharmony_ci encoding = tokenize.detect_encoding(file.readline)[0] 3037db96d56Sopenharmony_ci file = open(file_path, mode, encoding=encoding) 3047db96d56Sopenharmony_ci return file, file_path, (suffix, mode, type_) 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ci 3077db96d56Sopenharmony_cidef reload(module): 3087db96d56Sopenharmony_ci """**DEPRECATED** 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci Reload the module and return it. 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ci The module must have been successfully imported before. 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci """ 3157db96d56Sopenharmony_ci return importlib.reload(module) 3167db96d56Sopenharmony_ci 3177db96d56Sopenharmony_ci 3187db96d56Sopenharmony_cidef init_builtin(name): 3197db96d56Sopenharmony_ci """**DEPRECATED** 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_ci Load and return a built-in module by name, or None is such module doesn't 3227db96d56Sopenharmony_ci exist 3237db96d56Sopenharmony_ci """ 3247db96d56Sopenharmony_ci try: 3257db96d56Sopenharmony_ci return _builtin_from_name(name) 3267db96d56Sopenharmony_ci except ImportError: 3277db96d56Sopenharmony_ci return None 3287db96d56Sopenharmony_ci 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ciif create_dynamic: 3317db96d56Sopenharmony_ci def load_dynamic(name, path, file=None): 3327db96d56Sopenharmony_ci """**DEPRECATED** 3337db96d56Sopenharmony_ci 3347db96d56Sopenharmony_ci Load an extension module. 3357db96d56Sopenharmony_ci """ 3367db96d56Sopenharmony_ci import importlib.machinery 3377db96d56Sopenharmony_ci loader = importlib.machinery.ExtensionFileLoader(name, path) 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_ci # Issue #24748: Skip the sys.modules check in _load_module_shim; 3407db96d56Sopenharmony_ci # always load new extension 3417db96d56Sopenharmony_ci spec = importlib.machinery.ModuleSpec( 3427db96d56Sopenharmony_ci name=name, loader=loader, origin=path) 3437db96d56Sopenharmony_ci return _load(spec) 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_cielse: 3467db96d56Sopenharmony_ci load_dynamic = None 347