Execute the spec's specified module in an existing module's namespace.
(spec, module)
| 816 | |
| 817 | # Used by importlib.reload(). |
| 818 | def _exec(spec, module): |
| 819 | """Execute the spec's specified module in an existing module's namespace.""" |
| 820 | name = spec.name |
| 821 | with _ModuleLockManager(name): |
| 822 | if sys.modules.get(name) is not module: |
| 823 | msg = f'module {name!r} not in sys.modules' |
| 824 | raise ImportError(msg, name=name) |
| 825 | try: |
| 826 | if spec.loader is None: |
| 827 | if spec.submodule_search_locations is None: |
| 828 | raise ImportError('missing loader', name=spec.name) |
| 829 | # Namespace package. |
| 830 | _init_module_attrs(spec, module, override=True) |
| 831 | else: |
| 832 | _init_module_attrs(spec, module, override=True) |
| 833 | spec.loader.exec_module(module) |
| 834 | finally: |
| 835 | # Update the order of insertion into sys.modules for module |
| 836 | # clean-up at shutdown. |
| 837 | module = sys.modules.pop(spec.name) |
| 838 | sys.modules[spec.name] = module |
| 839 | return module |
| 840 | |
| 841 | def _load_unlocked(spec): |
| 842 | # A helper for direct use by the import system. |
nothing calls this directly
no test coverage detected
searching dependent graphs…