17db96d56Sopenharmony_ci"""A pure Python implementation of import.""" 27db96d56Sopenharmony_ci__all__ = ['__import__', 'import_module', 'invalidate_caches', 'reload'] 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci# Bootstrap help ##################################################### 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci# Until bootstrapping is complete, DO NOT import any modules that attempt 77db96d56Sopenharmony_ci# to import importlib._bootstrap (directly or indirectly). Since this 87db96d56Sopenharmony_ci# partially initialised package would be present in sys.modules, those 97db96d56Sopenharmony_ci# modules would get an uninitialised copy of the source version, instead 107db96d56Sopenharmony_ci# of a fully initialised version (either the frozen one or the one 117db96d56Sopenharmony_ci# initialised below if the frozen one is not available). 127db96d56Sopenharmony_ciimport _imp # Just the builtin component, NOT the full Python module 137db96d56Sopenharmony_ciimport sys 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_citry: 167db96d56Sopenharmony_ci import _frozen_importlib as _bootstrap 177db96d56Sopenharmony_ciexcept ImportError: 187db96d56Sopenharmony_ci from . import _bootstrap 197db96d56Sopenharmony_ci _bootstrap._setup(sys, _imp) 207db96d56Sopenharmony_cielse: 217db96d56Sopenharmony_ci # importlib._bootstrap is the built-in import, ensure we don't create 227db96d56Sopenharmony_ci # a second copy of the module. 237db96d56Sopenharmony_ci _bootstrap.__name__ = 'importlib._bootstrap' 247db96d56Sopenharmony_ci _bootstrap.__package__ = 'importlib' 257db96d56Sopenharmony_ci try: 267db96d56Sopenharmony_ci _bootstrap.__file__ = __file__.replace('__init__.py', '_bootstrap.py') 277db96d56Sopenharmony_ci except NameError: 287db96d56Sopenharmony_ci # __file__ is not guaranteed to be defined, e.g. if this code gets 297db96d56Sopenharmony_ci # frozen by a tool like cx_Freeze. 307db96d56Sopenharmony_ci pass 317db96d56Sopenharmony_ci sys.modules['importlib._bootstrap'] = _bootstrap 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_citry: 347db96d56Sopenharmony_ci import _frozen_importlib_external as _bootstrap_external 357db96d56Sopenharmony_ciexcept ImportError: 367db96d56Sopenharmony_ci from . import _bootstrap_external 377db96d56Sopenharmony_ci _bootstrap_external._set_bootstrap_module(_bootstrap) 387db96d56Sopenharmony_ci _bootstrap._bootstrap_external = _bootstrap_external 397db96d56Sopenharmony_cielse: 407db96d56Sopenharmony_ci _bootstrap_external.__name__ = 'importlib._bootstrap_external' 417db96d56Sopenharmony_ci _bootstrap_external.__package__ = 'importlib' 427db96d56Sopenharmony_ci try: 437db96d56Sopenharmony_ci _bootstrap_external.__file__ = __file__.replace('__init__.py', '_bootstrap_external.py') 447db96d56Sopenharmony_ci except NameError: 457db96d56Sopenharmony_ci # __file__ is not guaranteed to be defined, e.g. if this code gets 467db96d56Sopenharmony_ci # frozen by a tool like cx_Freeze. 477db96d56Sopenharmony_ci pass 487db96d56Sopenharmony_ci sys.modules['importlib._bootstrap_external'] = _bootstrap_external 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci# To simplify imports in test code 517db96d56Sopenharmony_ci_pack_uint32 = _bootstrap_external._pack_uint32 527db96d56Sopenharmony_ci_unpack_uint32 = _bootstrap_external._unpack_uint32 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci# Fully bootstrapped at this point, import whatever you like, circular 557db96d56Sopenharmony_ci# dependencies and startup overhead minimisation permitting :) 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ciimport warnings 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci# Public API ######################################################### 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_cifrom ._bootstrap import __import__ 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_cidef invalidate_caches(): 667db96d56Sopenharmony_ci """Call the invalidate_caches() method on all meta path finders stored in 677db96d56Sopenharmony_ci sys.meta_path (where implemented).""" 687db96d56Sopenharmony_ci for finder in sys.meta_path: 697db96d56Sopenharmony_ci if hasattr(finder, 'invalidate_caches'): 707db96d56Sopenharmony_ci finder.invalidate_caches() 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_cidef find_loader(name, path=None): 747db96d56Sopenharmony_ci """Return the loader for the specified module. 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci This is a backward-compatible wrapper around find_spec(). 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci This function is deprecated in favor of importlib.util.find_spec(). 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci """ 817db96d56Sopenharmony_ci warnings.warn('Deprecated since Python 3.4 and slated for removal in ' 827db96d56Sopenharmony_ci 'Python 3.12; use importlib.util.find_spec() instead', 837db96d56Sopenharmony_ci DeprecationWarning, stacklevel=2) 847db96d56Sopenharmony_ci try: 857db96d56Sopenharmony_ci loader = sys.modules[name].__loader__ 867db96d56Sopenharmony_ci if loader is None: 877db96d56Sopenharmony_ci raise ValueError('{}.__loader__ is None'.format(name)) 887db96d56Sopenharmony_ci else: 897db96d56Sopenharmony_ci return loader 907db96d56Sopenharmony_ci except KeyError: 917db96d56Sopenharmony_ci pass 927db96d56Sopenharmony_ci except AttributeError: 937db96d56Sopenharmony_ci raise ValueError('{}.__loader__ is not set'.format(name)) from None 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci spec = _bootstrap._find_spec(name, path) 967db96d56Sopenharmony_ci # We won't worry about malformed specs (missing attributes). 977db96d56Sopenharmony_ci if spec is None: 987db96d56Sopenharmony_ci return None 997db96d56Sopenharmony_ci if spec.loader is None: 1007db96d56Sopenharmony_ci if spec.submodule_search_locations is None: 1017db96d56Sopenharmony_ci raise ImportError('spec for {} missing loader'.format(name), 1027db96d56Sopenharmony_ci name=name) 1037db96d56Sopenharmony_ci raise ImportError('namespace packages do not have loaders', 1047db96d56Sopenharmony_ci name=name) 1057db96d56Sopenharmony_ci return spec.loader 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_cidef import_module(name, package=None): 1097db96d56Sopenharmony_ci """Import a module. 1107db96d56Sopenharmony_ci 1117db96d56Sopenharmony_ci The 'package' argument is required when performing a relative import. It 1127db96d56Sopenharmony_ci specifies the package to use as the anchor point from which to resolve the 1137db96d56Sopenharmony_ci relative import to an absolute import. 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci """ 1167db96d56Sopenharmony_ci level = 0 1177db96d56Sopenharmony_ci if name.startswith('.'): 1187db96d56Sopenharmony_ci if not package: 1197db96d56Sopenharmony_ci msg = ("the 'package' argument is required to perform a relative " 1207db96d56Sopenharmony_ci "import for {!r}") 1217db96d56Sopenharmony_ci raise TypeError(msg.format(name)) 1227db96d56Sopenharmony_ci for character in name: 1237db96d56Sopenharmony_ci if character != '.': 1247db96d56Sopenharmony_ci break 1257db96d56Sopenharmony_ci level += 1 1267db96d56Sopenharmony_ci return _bootstrap._gcd_import(name[level:], package, level) 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci_RELOADING = {} 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci 1327db96d56Sopenharmony_cidef reload(module): 1337db96d56Sopenharmony_ci """Reload the module and return it. 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci The module must have been successfully imported before. 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ci """ 1387db96d56Sopenharmony_ci try: 1397db96d56Sopenharmony_ci name = module.__spec__.name 1407db96d56Sopenharmony_ci except AttributeError: 1417db96d56Sopenharmony_ci try: 1427db96d56Sopenharmony_ci name = module.__name__ 1437db96d56Sopenharmony_ci except AttributeError: 1447db96d56Sopenharmony_ci raise TypeError("reload() argument must be a module") 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci if sys.modules.get(name) is not module: 1477db96d56Sopenharmony_ci msg = "module {} not in sys.modules" 1487db96d56Sopenharmony_ci raise ImportError(msg.format(name), name=name) 1497db96d56Sopenharmony_ci if name in _RELOADING: 1507db96d56Sopenharmony_ci return _RELOADING[name] 1517db96d56Sopenharmony_ci _RELOADING[name] = module 1527db96d56Sopenharmony_ci try: 1537db96d56Sopenharmony_ci parent_name = name.rpartition('.')[0] 1547db96d56Sopenharmony_ci if parent_name: 1557db96d56Sopenharmony_ci try: 1567db96d56Sopenharmony_ci parent = sys.modules[parent_name] 1577db96d56Sopenharmony_ci except KeyError: 1587db96d56Sopenharmony_ci msg = "parent {!r} not in sys.modules" 1597db96d56Sopenharmony_ci raise ImportError(msg.format(parent_name), 1607db96d56Sopenharmony_ci name=parent_name) from None 1617db96d56Sopenharmony_ci else: 1627db96d56Sopenharmony_ci pkgpath = parent.__path__ 1637db96d56Sopenharmony_ci else: 1647db96d56Sopenharmony_ci pkgpath = None 1657db96d56Sopenharmony_ci target = module 1667db96d56Sopenharmony_ci spec = module.__spec__ = _bootstrap._find_spec(name, pkgpath, target) 1677db96d56Sopenharmony_ci if spec is None: 1687db96d56Sopenharmony_ci raise ModuleNotFoundError(f"spec not found for the module {name!r}", name=name) 1697db96d56Sopenharmony_ci _bootstrap._exec(spec, module) 1707db96d56Sopenharmony_ci # The module may have replaced itself in sys.modules! 1717db96d56Sopenharmony_ci return sys.modules[name] 1727db96d56Sopenharmony_ci finally: 1737db96d56Sopenharmony_ci try: 1747db96d56Sopenharmony_ci del _RELOADING[name] 1757db96d56Sopenharmony_ci except KeyError: 1767db96d56Sopenharmony_ci pass 177