1"""Core implementation of import.
2
3This module is NOT meant to be directly imported! It has been designed such
4that it can be bootstrapped into Python as the implementation of import. As
5such it requires the injection of specific modules and attributes in order to
6work. One should use importlib as the public-facing version of this module.
7
8"""
9#
10# IMPORTANT: Whenever making changes to this module, be sure to run
11# a top-level make in order to get the frozen version of the module
12# updated. Not doing so will result in the Makefile to fail for
13# all others who don't have a ./python around to freeze the module
14# in the early stages of compilation.
15#
16
17# See importlib._setup() for what is injected into the global namespace.
18
19# When editing this code be aware that code executed at import time CANNOT
20# reference any injected objects! This includes not only global code but also
21# anything specified at the class level.
22
23# Bootstrap-related code ######################################################
24
25_bootstrap_external = None
26
27def _wrap(new, old):
28    """Simple substitute for functools.update_wrapper."""
29    for replace in ['__module__', '__name__', '__qualname__', '__doc__']:
30        if hasattr(old, replace):
31            setattr(new, replace, getattr(old, replace))
32    new.__dict__.update(old.__dict__)
33
34
35def _new_module(name):
36    return type(sys)(name)
37
38
39# Module-level locking ########################################################
40
41# A dict mapping module names to weakrefs of _ModuleLock instances
42_module_locks = {}
43# A dict mapping thread ids to _ModuleLock instances
44_blocking_on = {}
45
46
47class _DeadlockError(RuntimeError):
48    pass
49
50
51class _ModuleLock:
52    """A recursive lock implementation which is able to detect deadlocks
53    (e.g. thread 1 trying to take locks A then B, and thread 2 trying to
54    take locks B then A).
55    """
56
57    def __init__(self, name):
58        self.lock = _thread.allocate_lock()
59        self.wakeup = _thread.allocate_lock()
60        self.name = name
61        self.owner = None
62        self.count = 0
63        self.waiters = 0
64
65    def has_deadlock(self):
66        # Deadlock avoidance for concurrent circular imports.
67        me = _thread.get_ident()
68        tid = self.owner
69        while True:
70            lock = _blocking_on.get(tid)
71            if lock is None:
72                return False
73            tid = lock.owner
74            if tid == me:
75                return True
76
77    def acquire(self):
78        """
79        Acquire the module lock.  If a potential deadlock is detected,
80        a _DeadlockError is raised.
81        Otherwise, the lock is always acquired and True is returned.
82        """
83        tid = _thread.get_ident()
84        _blocking_on[tid] = self
85        try:
86            while True:
87                with self.lock:
88                    if self.count == 0 or self.owner == tid:
89                        self.owner = tid
90                        self.count += 1
91                        return True
92                    if self.has_deadlock():
93                        raise _DeadlockError('deadlock detected by %r' % self)
94                    if self.wakeup.acquire(False):
95                        self.waiters += 1
96                # Wait for a release() call
97                self.wakeup.acquire()
98                self.wakeup.release()
99        finally:
100            del _blocking_on[tid]
101
102    def release(self):
103        tid = _thread.get_ident()
104        with self.lock:
105            if self.owner != tid:
106                raise RuntimeError('cannot release un-acquired lock')
107            assert self.count > 0
108            self.count -= 1
109            if self.count == 0:
110                self.owner = None
111                if self.waiters:
112                    self.waiters -= 1
113                    self.wakeup.release()
114
115    def __repr__(self):
116        return '_ModuleLock({!r}) at {}'.format(self.name, id(self))
117
118
119class _DummyModuleLock:
120    """A simple _ModuleLock equivalent for Python builds without
121    multi-threading support."""
122
123    def __init__(self, name):
124        self.name = name
125        self.count = 0
126
127    def acquire(self):
128        self.count += 1
129        return True
130
131    def release(self):
132        if self.count == 0:
133            raise RuntimeError('cannot release un-acquired lock')
134        self.count -= 1
135
136    def __repr__(self):
137        return '_DummyModuleLock({!r}) at {}'.format(self.name, id(self))
138
139
140class _ModuleLockManager:
141
142    def __init__(self, name):
143        self._name = name
144        self._lock = None
145
146    def __enter__(self):
147        try:
148            self._lock = _get_module_lock(self._name)
149        finally:
150            _imp.release_lock()
151        self._lock.acquire()
152
153    def __exit__(self, *args, **kwargs):
154        self._lock.release()
155
156
157# The following two functions are for consumption by Python/import.c.
158
159def _get_module_lock(name):
160    """Get or create the module lock for a given module name.
161
162    Should only be called with the import lock taken."""
163    lock = None
164    try:
165        lock = _module_locks[name]()
166    except KeyError:
167        pass
168    if lock is None:
169        if _thread is None:
170            lock = _DummyModuleLock(name)
171        else:
172            lock = _ModuleLock(name)
173        def cb(_):
174            del _module_locks[name]
175        _module_locks[name] = _weakref.ref(lock, cb)
176    return lock
177
178def _lock_unlock_module(name):
179    """Release the global import lock, and acquires then release the
180    module lock for a given module name.
181    This is used to ensure a module is completely initialized, in the
182    event it is being imported by another thread.
183
184    Should only be called with the import lock taken."""
185    lock = _get_module_lock(name)
186    _imp.release_lock()
187    try:
188        lock.acquire()
189    except _DeadlockError:
190        # Concurrent circular import, we'll accept a partially initialized
191        # module object.
192        pass
193    else:
194        lock.release()
195
196# Frame stripping magic ###############################################
197def _call_with_frames_removed(f, *args, **kwds):
198    """remove_importlib_frames in import.c will always remove sequences
199    of importlib frames that end with a call to this function
200
201    Use it instead of a normal call in places where including the importlib
202    frames introduces unwanted noise into the traceback (e.g. when executing
203    module code)
204    """
205    return f(*args, **kwds)
206
207
208def _verbose_message(message, *args, verbosity=1):
209    """Print the message to stderr if -v/PYTHONVERBOSE is turned on."""
210    if sys.flags.verbose >= verbosity:
211        if not message.startswith(('#', 'import ')):
212            message = '# ' + message
213        print(message.format(*args), file=sys.stderr)
214
215
216def _requires_builtin(fxn):
217    """Decorator to verify the named module is built-in."""
218    def _requires_builtin_wrapper(self, fullname):
219        if fullname not in sys.builtin_module_names:
220            raise ImportError('{!r} is not a built-in module'.format(fullname),
221                              name=fullname)
222        return fxn(self, fullname)
223    _wrap(_requires_builtin_wrapper, fxn)
224    return _requires_builtin_wrapper
225
226
227def _requires_frozen(fxn):
228    """Decorator to verify the named module is frozen."""
229    def _requires_frozen_wrapper(self, fullname):
230        if not _imp.is_frozen(fullname):
231            raise ImportError('{!r} is not a frozen module'.format(fullname),
232                              name=fullname)
233        return fxn(self, fullname)
234    _wrap(_requires_frozen_wrapper, fxn)
235    return _requires_frozen_wrapper
236
237
238# Typically used by loader classes as a method replacement.
239def _load_module_shim(self, fullname):
240    """Load the specified module into sys.modules and return it.
241
242    This method is deprecated.  Use loader.exec_module instead.
243
244    """
245    spec = spec_from_loader(fullname, self)
246    if fullname in sys.modules:
247        module = sys.modules[fullname]
248        _exec(spec, module)
249        return sys.modules[fullname]
250    else:
251        return _load(spec)
252
253# Module specifications #######################################################
254
255def _module_repr(module):
256    # The implementation of ModuleType.__repr__().
257    loader = getattr(module, '__loader__', None)
258    if hasattr(loader, 'module_repr'):
259        # As soon as BuiltinImporter, FrozenImporter, and NamespaceLoader
260        # drop their implementations for module_repr. we can add a
261        # deprecation warning here.
262        try:
263            return loader.module_repr(module)
264        except Exception:
265            pass
266    try:
267        spec = module.__spec__
268    except AttributeError:
269        pass
270    else:
271        if spec is not None:
272            return _module_repr_from_spec(spec)
273
274    # We could use module.__class__.__name__ instead of 'module' in the
275    # various repr permutations.
276    try:
277        name = module.__name__
278    except AttributeError:
279        name = '?'
280    try:
281        filename = module.__file__
282    except AttributeError:
283        if loader is None:
284            return '<module {!r}>'.format(name)
285        else:
286            return '<module {!r} ({!r})>'.format(name, loader)
287    else:
288        return '<module {!r} from {!r}>'.format(name, filename)
289
290
291class _installed_safely:
292
293    def __init__(self, module):
294        self._module = module
295        self._spec = module.__spec__
296
297    def __enter__(self):
298        # This must be done before putting the module in sys.modules
299        # (otherwise an optimization shortcut in import.c becomes
300        # wrong)
301        self._spec._initializing = True
302        sys.modules[self._spec.name] = self._module
303
304    def __exit__(self, *args):
305        try:
306            spec = self._spec
307            if any(arg is not None for arg in args):
308                try:
309                    del sys.modules[spec.name]
310                except KeyError:
311                    pass
312            else:
313                _verbose_message('import {!r} # {!r}', spec.name, spec.loader)
314        finally:
315            self._spec._initializing = False
316
317
318class ModuleSpec:
319    """The specification for a module, used for loading.
320
321    A module's spec is the source for information about the module.  For
322    data associated with the module, including source, use the spec's
323    loader.
324
325    `name` is the absolute name of the module.  `loader` is the loader
326    to use when loading the module.  `parent` is the name of the
327    package the module is in.  The parent is derived from the name.
328
329    `is_package` determines if the module is considered a package or
330    not.  On modules this is reflected by the `__path__` attribute.
331
332    `origin` is the specific location used by the loader from which to
333    load the module, if that information is available.  When filename is
334    set, origin will match.
335
336    `has_location` indicates that a spec's "origin" reflects a location.
337    When this is True, `__file__` attribute of the module is set.
338
339    `cached` is the location of the cached bytecode file, if any.  It
340    corresponds to the `__cached__` attribute.
341
342    `submodule_search_locations` is the sequence of path entries to
343    search when importing submodules.  If set, is_package should be
344    True--and False otherwise.
345
346    Packages are simply modules that (may) have submodules.  If a spec
347    has a non-None value in `submodule_search_locations`, the import
348    system will consider modules loaded from the spec as packages.
349
350    Only finders (see importlib.abc.MetaPathFinder and
351    importlib.abc.PathEntryFinder) should modify ModuleSpec instances.
352
353    """
354
355    def __init__(self, name, loader, *, origin=None, loader_state=None,
356                 is_package=None):
357        self.name = name
358        self.loader = loader
359        self.origin = origin
360        self.loader_state = loader_state
361        self.submodule_search_locations = [] if is_package else None
362
363        # file-location attributes
364        self._set_fileattr = False
365        self._cached = None
366
367    def __repr__(self):
368        args = ['name={!r}'.format(self.name),
369                'loader={!r}'.format(self.loader)]
370        if self.origin is not None:
371            args.append('origin={!r}'.format(self.origin))
372        if self.submodule_search_locations is not None:
373            args.append('submodule_search_locations={}'
374                        .format(self.submodule_search_locations))
375        return '{}({})'.format(self.__class__.__name__, ', '.join(args))
376
377    def __eq__(self, other):
378        smsl = self.submodule_search_locations
379        try:
380            return (self.name == other.name and
381                    self.loader == other.loader and
382                    self.origin == other.origin and
383                    smsl == other.submodule_search_locations and
384                    self.cached == other.cached and
385                    self.has_location == other.has_location)
386        except AttributeError:
387            return False
388
389    @property
390    def cached(self):
391        if self._cached is None:
392            if self.origin is not None and self._set_fileattr:
393                if _bootstrap_external is None:
394                    raise NotImplementedError
395                self._cached = _bootstrap_external._get_cached(self.origin)
396        return self._cached
397
398    @cached.setter
399    def cached(self, cached):
400        self._cached = cached
401
402    @property
403    def parent(self):
404        """The name of the module's parent."""
405        if self.submodule_search_locations is None:
406            return self.name.rpartition('.')[0]
407        else:
408            return self.name
409
410    @property
411    def has_location(self):
412        return self._set_fileattr
413
414    @has_location.setter
415    def has_location(self, value):
416        self._set_fileattr = bool(value)
417
418
419def spec_from_loader(name, loader, *, origin=None, is_package=None):
420    """Return a module spec based on various loader methods."""
421    if hasattr(loader, 'get_filename'):
422        if _bootstrap_external is None:
423            raise NotImplementedError
424        spec_from_file_location = _bootstrap_external.spec_from_file_location
425
426        if is_package is None:
427            return spec_from_file_location(name, loader=loader)
428        search = [] if is_package else None
429        return spec_from_file_location(name, loader=loader,
430                                       submodule_search_locations=search)
431
432    if is_package is None:
433        if hasattr(loader, 'is_package'):
434            try:
435                is_package = loader.is_package(name)
436            except ImportError:
437                is_package = None  # aka, undefined
438        else:
439            # the default
440            is_package = False
441
442    return ModuleSpec(name, loader, origin=origin, is_package=is_package)
443
444
445_POPULATE = object()
446
447
448def _spec_from_module(module, loader=None, origin=None):
449    # This function is meant for use in _setup().
450    try:
451        spec = module.__spec__
452    except AttributeError:
453        pass
454    else:
455        if spec is not None:
456            return spec
457
458    name = module.__name__
459    if loader is None:
460        try:
461            loader = module.__loader__
462        except AttributeError:
463            # loader will stay None.
464            pass
465    try:
466        location = module.__file__
467    except AttributeError:
468        location = None
469    if origin is None:
470        if location is None:
471            try:
472                origin = loader._ORIGIN
473            except AttributeError:
474                origin = None
475        else:
476            origin = location
477    try:
478        cached = module.__cached__
479    except AttributeError:
480        cached = None
481    try:
482        submodule_search_locations = list(module.__path__)
483    except AttributeError:
484        submodule_search_locations = None
485
486    spec = ModuleSpec(name, loader, origin=origin)
487    spec._set_fileattr = False if location is None else True
488    spec.cached = cached
489    spec.submodule_search_locations = submodule_search_locations
490    return spec
491
492
493def _init_module_attrs(spec, module, *, override=False):
494    # The passed-in module may be not support attribute assignment,
495    # in which case we simply don't set the attributes.
496    # __name__
497    if (override or getattr(module, '__name__', None) is None):
498        try:
499            module.__name__ = spec.name
500        except AttributeError:
501            pass
502    # __loader__
503    if override or getattr(module, '__loader__', None) is None:
504        loader = spec.loader
505        if loader is None:
506            # A backward compatibility hack.
507            if spec.submodule_search_locations is not None:
508                if _bootstrap_external is None:
509                    raise NotImplementedError
510                _NamespaceLoader = _bootstrap_external._NamespaceLoader
511
512                loader = _NamespaceLoader.__new__(_NamespaceLoader)
513                loader._path = spec.submodule_search_locations
514        try:
515            module.__loader__ = loader
516        except AttributeError:
517            pass
518    # __package__
519    if override or getattr(module, '__package__', None) is None:
520        try:
521            module.__package__ = spec.parent
522        except AttributeError:
523            pass
524    # __spec__
525    try:
526        module.__spec__ = spec
527    except AttributeError:
528        pass
529    # __path__
530    if override or getattr(module, '__path__', None) is None:
531        if spec.submodule_search_locations is not None:
532            try:
533                module.__path__ = spec.submodule_search_locations
534            except AttributeError:
535                pass
536    # __file__/__cached__
537    if spec.has_location:
538        if override or getattr(module, '__file__', None) is None:
539            try:
540                module.__file__ = spec.origin
541            except AttributeError:
542                pass
543
544        if override or getattr(module, '__cached__', None) is None:
545            if spec.cached is not None:
546                try:
547                    module.__cached__ = spec.cached
548                except AttributeError:
549                    pass
550    return module
551
552
553def module_from_spec(spec):
554    """Create a module based on the provided spec."""
555    # Typically loaders will not implement create_module().
556    module = None
557    if hasattr(spec.loader, 'create_module'):
558        # If create_module() returns `None` then it means default
559        # module creation should be used.
560        module = spec.loader.create_module(spec)
561    elif hasattr(spec.loader, 'exec_module'):
562        raise ImportError('loaders that define exec_module() '
563                          'must also define create_module()')
564    if module is None:
565        module = _new_module(spec.name)
566    _init_module_attrs(spec, module)
567    return module
568
569
570def _module_repr_from_spec(spec):
571    """Return the repr to use for the module."""
572    # We mostly replicate _module_repr() using the spec attributes.
573    name = '?' if spec.name is None else spec.name
574    if spec.origin is None:
575        if spec.loader is None:
576            return '<module {!r}>'.format(name)
577        else:
578            return '<module {!r} ({!r})>'.format(name, spec.loader)
579    else:
580        if spec.has_location:
581            return '<module {!r} from {!r}>'.format(name, spec.origin)
582        else:
583            return '<module {!r} ({})>'.format(spec.name, spec.origin)
584
585
586# Used by importlib.reload() and _load_module_shim().
587def _exec(spec, module):
588    """Execute the spec's specified module in an existing module's namespace."""
589    name = spec.name
590    _imp.acquire_lock()
591    with _ModuleLockManager(name):
592        if sys.modules.get(name) is not module:
593            msg = 'module {!r} not in sys.modules'.format(name)
594            raise ImportError(msg, name=name)
595        if spec.loader is None:
596            if spec.submodule_search_locations is None:
597                raise ImportError('missing loader', name=spec.name)
598            # namespace package
599            _init_module_attrs(spec, module, override=True)
600            return module
601        _init_module_attrs(spec, module, override=True)
602        if not hasattr(spec.loader, 'exec_module'):
603            # (issue19713) Once BuiltinImporter and ExtensionFileLoader
604            # have exec_module() implemented, we can add a deprecation
605            # warning here.
606            spec.loader.load_module(name)
607        else:
608            spec.loader.exec_module(module)
609    return sys.modules[name]
610
611
612def _load_backward_compatible(spec):
613    # (issue19713) Once BuiltinImporter and ExtensionFileLoader
614    # have exec_module() implemented, we can add a deprecation
615    # warning here.
616    spec.loader.load_module(spec.name)
617    # The module must be in sys.modules at this point!
618    module = sys.modules[spec.name]
619    if getattr(module, '__loader__', None) is None:
620        try:
621            module.__loader__ = spec.loader
622        except AttributeError:
623            pass
624    if getattr(module, '__package__', None) is None:
625        try:
626            # Since module.__path__ may not line up with
627            # spec.submodule_search_paths, we can't necessarily rely
628            # on spec.parent here.
629            module.__package__ = module.__name__
630            if not hasattr(module, '__path__'):
631                module.__package__ = spec.name.rpartition('.')[0]
632        except AttributeError:
633            pass
634    if getattr(module, '__spec__', None) is None:
635        try:
636            module.__spec__ = spec
637        except AttributeError:
638            pass
639    return module
640
641def _load_unlocked(spec):
642    # A helper for direct use by the import system.
643    if spec.loader is not None:
644        # not a namespace package
645        if not hasattr(spec.loader, 'exec_module'):
646            return _load_backward_compatible(spec)
647
648    module = module_from_spec(spec)
649    with _installed_safely(module):
650        if spec.loader is None:
651            if spec.submodule_search_locations is None:
652                raise ImportError('missing loader', name=spec.name)
653            # A namespace package so do nothing.
654        else:
655            spec.loader.exec_module(module)
656
657    # We don't ensure that the import-related module attributes get
658    # set in the sys.modules replacement case.  Such modules are on
659    # their own.
660    return sys.modules[spec.name]
661
662# A method used during testing of _load_unlocked() and by
663# _load_module_shim().
664def _load(spec):
665    """Return a new module object, loaded by the spec's loader.
666
667    The module is not added to its parent.
668
669    If a module is already in sys.modules, that existing module gets
670    clobbered.
671
672    """
673    _imp.acquire_lock()
674    with _ModuleLockManager(spec.name):
675        return _load_unlocked(spec)
676
677
678# Loaders #####################################################################
679
680class BuiltinImporter:
681
682    """Meta path import for built-in modules.
683
684    All methods are either class or static methods to avoid the need to
685    instantiate the class.
686
687    """
688
689    @staticmethod
690    def module_repr(module):
691        """Return repr for the module.
692
693        The method is deprecated.  The import machinery does the job itself.
694
695        """
696        return '<module {!r} (built-in)>'.format(module.__name__)
697
698    @classmethod
699    def find_spec(cls, fullname, path=None, target=None):
700        if path is not None:
701            return None
702        if _imp.is_builtin(fullname):
703            return spec_from_loader(fullname, cls, origin='built-in')
704        else:
705            return None
706
707    @classmethod
708    def find_module(cls, fullname, path=None):
709        """Find the built-in module.
710
711        If 'path' is ever specified then the search is considered a failure.
712
713        This method is deprecated.  Use find_spec() instead.
714
715        """
716        spec = cls.find_spec(fullname, path)
717        return spec.loader if spec is not None else None
718
719    @classmethod
720    def create_module(self, spec):
721        """Create a built-in module"""
722        if spec.name not in sys.builtin_module_names:
723            raise ImportError('{!r} is not a built-in module'.format(spec.name),
724                              name=spec.name)
725        return _call_with_frames_removed(_imp.create_builtin, spec)
726
727    @classmethod
728    def exec_module(self, module):
729        """Exec a built-in module"""
730        _call_with_frames_removed(_imp.exec_builtin, module)
731
732    @classmethod
733    @_requires_builtin
734    def get_code(cls, fullname):
735        """Return None as built-in modules do not have code objects."""
736        return None
737
738    @classmethod
739    @_requires_builtin
740    def get_source(cls, fullname):
741        """Return None as built-in modules do not have source code."""
742        return None
743
744    @classmethod
745    @_requires_builtin
746    def is_package(cls, fullname):
747        """Return False as built-in modules are never packages."""
748        return False
749
750    load_module = classmethod(_load_module_shim)
751
752
753class FrozenImporter:
754
755    """Meta path import for frozen modules.
756
757    All methods are either class or static methods to avoid the need to
758    instantiate the class.
759
760    """
761
762    @staticmethod
763    def module_repr(m):
764        """Return repr for the module.
765
766        The method is deprecated.  The import machinery does the job itself.
767
768        """
769        return '<module {!r} (frozen)>'.format(m.__name__)
770
771    @classmethod
772    def find_spec(cls, fullname, path=None, target=None):
773        if _imp.is_frozen(fullname):
774            return spec_from_loader(fullname, cls, origin='frozen')
775        else:
776            return None
777
778    @classmethod
779    def find_module(cls, fullname, path=None):
780        """Find a frozen module.
781
782        This method is deprecated.  Use find_spec() instead.
783
784        """
785        return cls if _imp.is_frozen(fullname) else None
786
787    @classmethod
788    def create_module(cls, spec):
789        """Use default semantics for module creation."""
790
791    @staticmethod
792    def exec_module(module):
793        name = module.__spec__.name
794        if not _imp.is_frozen(name):
795            raise ImportError('{!r} is not a frozen module'.format(name),
796                              name=name)
797        code = _call_with_frames_removed(_imp.get_frozen_object, name)
798        exec(code, module.__dict__)
799
800    @classmethod
801    def load_module(cls, fullname):
802        """Load a frozen module.
803
804        This method is deprecated.  Use exec_module() instead.
805
806        """
807        return _load_module_shim(cls, fullname)
808
809    @classmethod
810    @_requires_frozen
811    def get_code(cls, fullname):
812        """Return the code object for the frozen module."""
813        return _imp.get_frozen_object(fullname)
814
815    @classmethod
816    @_requires_frozen
817    def get_source(cls, fullname):
818        """Return None as frozen modules do not have source code."""
819        return None
820
821    @classmethod
822    @_requires_frozen
823    def is_package(cls, fullname):
824        """Return True if the frozen module is a package."""
825        return _imp.is_frozen_package(fullname)
826
827
828# Import itself ###############################################################
829
830class _ImportLockContext:
831
832    """Context manager for the import lock."""
833
834    def __enter__(self):
835        """Acquire the import lock."""
836        _imp.acquire_lock()
837
838    def __exit__(self, exc_type, exc_value, exc_traceback):
839        """Release the import lock regardless of any raised exceptions."""
840        _imp.release_lock()
841
842
843def _resolve_name(name, package, level):
844    """Resolve a relative module name to an absolute one."""
845    bits = package.rsplit('.', level - 1)
846    if len(bits) < level:
847        raise ValueError('attempted relative import beyond top-level package')
848    base = bits[0]
849    return '{}.{}'.format(base, name) if name else base
850
851
852def _find_spec_legacy(finder, name, path):
853    # This would be a good place for a DeprecationWarning if
854    # we ended up going that route.
855    loader = finder.find_module(name, path)
856    if loader is None:
857        return None
858    return spec_from_loader(name, loader)
859
860
861def _find_spec(name, path, target=None):
862    """Find a module's spec."""
863    meta_path = sys.meta_path
864    if meta_path is None:
865        # PyImport_Cleanup() is running or has been called.
866        raise ImportError("sys.meta_path is None, Python is likely "
867                          "shutting down")
868
869    if not meta_path:
870        _warnings.warn('sys.meta_path is empty', ImportWarning)
871
872    # We check sys.modules here for the reload case.  While a passed-in
873    # target will usually indicate a reload there is no guarantee, whereas
874    # sys.modules provides one.
875    is_reload = name in sys.modules
876    for finder in meta_path:
877        with _ImportLockContext():
878            try:
879                find_spec = finder.find_spec
880            except AttributeError:
881                spec = _find_spec_legacy(finder, name, path)
882                if spec is None:
883                    continue
884            else:
885                spec = find_spec(name, path, target)
886        if spec is not None:
887            # The parent import may have already imported this module.
888            if not is_reload and name in sys.modules:
889                module = sys.modules[name]
890                try:
891                    __spec__ = module.__spec__
892                except AttributeError:
893                    # We use the found spec since that is the one that
894                    # we would have used if the parent module hadn't
895                    # beaten us to the punch.
896                    return spec
897                else:
898                    if __spec__ is None:
899                        return spec
900                    else:
901                        return __spec__
902            else:
903                return spec
904    else:
905        return None
906
907
908def _sanity_check(name, package, level):
909    """Verify arguments are "sane"."""
910    if not isinstance(name, str):
911        raise TypeError('module name must be str, not {}'.format(type(name)))
912    if level < 0:
913        raise ValueError('level must be >= 0')
914    if level > 0:
915        if not isinstance(package, str):
916            raise TypeError('__package__ not set to a string')
917        elif not package:
918            raise ImportError('attempted relative import with no known parent '
919                              'package')
920        elif package not in sys.modules:
921            msg = ('Parent module {!r} not loaded, cannot perform relative '
922                   'import')
923            raise SystemError(msg.format(package))
924    if not name and level == 0:
925        raise ValueError('Empty module name')
926
927
928_ERR_MSG_PREFIX = 'No module named '
929_ERR_MSG = _ERR_MSG_PREFIX + '{!r}'
930
931def _find_and_load_unlocked(name, import_):
932    path = None
933    parent = name.rpartition('.')[0]
934    if parent:
935        if parent not in sys.modules:
936            _call_with_frames_removed(import_, parent)
937        # Crazy side-effects!
938        if name in sys.modules:
939            return sys.modules[name]
940        parent_module = sys.modules[parent]
941        try:
942            path = parent_module.__path__
943        except AttributeError:
944            msg = (_ERR_MSG + '; {!r} is not a package').format(name, parent)
945            raise ModuleNotFoundError(msg, name=name) from None
946    spec = _find_spec(name, path)
947    if spec is None:
948        raise ModuleNotFoundError(_ERR_MSG.format(name), name=name)
949    else:
950        module = _load_unlocked(spec)
951    if parent:
952        # Set the module as an attribute on its parent.
953        parent_module = sys.modules[parent]
954        setattr(parent_module, name.rpartition('.')[2], module)
955    return module
956
957
958def _find_and_load(name, import_):
959    """Find and load the module, and release the import lock."""
960    with _ModuleLockManager(name):
961        return _find_and_load_unlocked(name, import_)
962
963
964def _gcd_import(name, package=None, level=0):
965    """Import and return the module based on its name, the package the call is
966    being made from, and the level adjustment.
967
968    This function represents the greatest common denominator of functionality
969    between import_module and __import__. This includes setting __package__ if
970    the loader did not.
971
972    """
973    _sanity_check(name, package, level)
974    if level > 0:
975        name = _resolve_name(name, package, level)
976    _imp.acquire_lock()
977    if name not in sys.modules:
978        return _find_and_load(name, _gcd_import)
979    module = sys.modules[name]
980    if module is None:
981        _imp.release_lock()
982        message = ('import of {} halted; '
983                   'None in sys.modules'.format(name))
984        raise ModuleNotFoundError(message, name=name)
985    _lock_unlock_module(name)
986    return module
987
988
989def _handle_fromlist(module, fromlist, import_):
990    """Figure out what __import__ should return.
991
992    The import_ parameter is a callable which takes the name of module to
993    import. It is required to decouple the function from assuming importlib's
994    import implementation is desired.
995
996    """
997    # The hell that is fromlist ...
998    # If a package was imported, try to import stuff from fromlist.
999    if hasattr(module, '__path__'):
1000        if '*' in fromlist:
1001            fromlist = list(fromlist)
1002            fromlist.remove('*')
1003            if hasattr(module, '__all__'):
1004                fromlist.extend(module.__all__)
1005        for x in fromlist:
1006            if not hasattr(module, x):
1007                from_name = '{}.{}'.format(module.__name__, x)
1008                try:
1009                    _call_with_frames_removed(import_, from_name)
1010                except ModuleNotFoundError as exc:
1011                    # Backwards-compatibility dictates we ignore failed
1012                    # imports triggered by fromlist for modules that don't
1013                    # exist.
1014                    if exc.name == from_name:
1015                        continue
1016                    raise
1017    return module
1018
1019
1020def _calc___package__(globals):
1021    """Calculate what __package__ should be.
1022
1023    __package__ is not guaranteed to be defined or could be set to None
1024    to represent that its proper value is unknown.
1025
1026    """
1027    package = globals.get('__package__')
1028    spec = globals.get('__spec__')
1029    if package is not None:
1030        if spec is not None and package != spec.parent:
1031            _warnings.warn("__package__ != __spec__.parent "
1032                           f"({package!r} != {spec.parent!r})",
1033                           ImportWarning, stacklevel=3)
1034        return package
1035    elif spec is not None:
1036        return spec.parent
1037    else:
1038        _warnings.warn("can't resolve package from __spec__ or __package__, "
1039                       "falling back on __name__ and __path__",
1040                       ImportWarning, stacklevel=3)
1041        package = globals['__name__']
1042        if '__path__' not in globals:
1043            package = package.rpartition('.')[0]
1044    return package
1045
1046
1047def __import__(name, globals=None, locals=None, fromlist=(), level=0):
1048    """Import a module.
1049
1050    The 'globals' argument is used to infer where the import is occurring from
1051    to handle relative imports. The 'locals' argument is ignored. The
1052    'fromlist' argument specifies what should exist as attributes on the module
1053    being imported (e.g. ``from module import <fromlist>``).  The 'level'
1054    argument represents the package location to import from in a relative
1055    import (e.g. ``from ..pkg import mod`` would have a 'level' of 2).
1056
1057    """
1058    if level == 0:
1059        module = _gcd_import(name)
1060    else:
1061        globals_ = globals if globals is not None else {}
1062        package = _calc___package__(globals_)
1063        module = _gcd_import(name, package, level)
1064    if not fromlist:
1065        # Return up to the first dot in 'name'. This is complicated by the fact
1066        # that 'name' may be relative.
1067        if level == 0:
1068            return _gcd_import(name.partition('.')[0])
1069        elif not name:
1070            return module
1071        else:
1072            # Figure out where to slice the module's name up to the first dot
1073            # in 'name'.
1074            cut_off = len(name) - len(name.partition('.')[0])
1075            # Slice end needs to be positive to alleviate need to special-case
1076            # when ``'.' not in name``.
1077            return sys.modules[module.__name__[:len(module.__name__)-cut_off]]
1078    else:
1079        return _handle_fromlist(module, fromlist, _gcd_import)
1080
1081
1082def _builtin_from_name(name):
1083    spec = BuiltinImporter.find_spec(name)
1084    if spec is None:
1085        raise ImportError('no built-in module named ' + name)
1086    return _load_unlocked(spec)
1087
1088
1089def _setup(sys_module, _imp_module):
1090    """Setup importlib by importing needed built-in modules and injecting them
1091    into the global namespace.
1092
1093    As sys is needed for sys.modules access and _imp is needed to load built-in
1094    modules, those two modules must be explicitly passed in.
1095
1096    """
1097    global _imp, sys
1098    _imp = _imp_module
1099    sys = sys_module
1100
1101    # Set up the spec for existing builtin/frozen modules.
1102    module_type = type(sys)
1103    for name, module in sys.modules.items():
1104        if isinstance(module, module_type):
1105            if name in sys.builtin_module_names:
1106                loader = BuiltinImporter
1107            elif _imp.is_frozen(name):
1108                loader = FrozenImporter
1109            else:
1110                continue
1111            spec = _spec_from_module(module, loader)
1112            _init_module_attrs(spec, module)
1113
1114    # Directly load built-in modules needed during bootstrap.
1115    self_module = sys.modules[__name__]
1116    for builtin_name in ('_warnings',):
1117        if builtin_name not in sys.modules:
1118            builtin_module = _builtin_from_name(builtin_name)
1119        else:
1120            builtin_module = sys.modules[builtin_name]
1121        setattr(self_module, builtin_name, builtin_module)
1122
1123    # Directly load the _thread module (needed during bootstrap).
1124    try:
1125        thread_module = _builtin_from_name('_thread')
1126    except ImportError:
1127        # Python was built without threads
1128        thread_module = None
1129    setattr(self_module, '_thread', thread_module)
1130
1131    # Directly load the _weakref module (needed during bootstrap).
1132    weakref_module = _builtin_from_name('_weakref')
1133    setattr(self_module, '_weakref', weakref_module)
1134
1135
1136def _install(sys_module, _imp_module):
1137    """Install importlib as the implementation of import."""
1138    _setup(sys_module, _imp_module)
1139
1140    sys.meta_path.append(BuiltinImporter)
1141    sys.meta_path.append(FrozenImporter)
1142
1143    global _bootstrap_external
1144    import _frozen_importlib_external
1145    _bootstrap_external = _frozen_importlib_external
1146    _frozen_importlib_external._install(sys.modules[__name__])
1147