
.. _importsystem:

*****************
The import system
*****************

.. index:: single: import machinery

Python code in one :term:`module` gains access to the code in another module
by the process of :term:`importing` it.  The :keyword:`import` statement is
the most common way of invoking the import machinery, but it is not the only
way.  Functions such as :func:`importlib.import_module` and built-in
:func:`__import__` can also be used to invoke the import machinery.

The :keyword:`import` statement combines two operations; it searches for the
named module, then it binds the results of that search to a name in the local
scope.  The search operation of the :keyword:`!import` statement is defined as
a call to the :func:`__import__` function, with the appropriate arguments.
The return value of :func:`__import__` is used to perform the name
binding operation of the :keyword:`!import` statement.  See the
:keyword:`!import` statement for the exact details of that name binding
operation.

A direct call to :func:`__import__` performs only the module search and, if
found, the module creation operation.  While certain side-effects may occur,
such as the importing of parent packages, and the updating of various caches
(including :data:`sys.modules`), only the :keyword:`import` statement performs
a name binding operation.

When an :keyword:`import` statement is executed, the standard builtin
:func:`__import__` function is called. Other mechanisms for invoking the
import system (such as :func:`importlib.import_module`) may choose to bypass
:func:`__import__` and use their own solutions to implement import semantics.

When a module is first imported, Python searches for the module and if found,
it creates a module object [#fnmo]_, initializing it.  If the named module
cannot be found, a :exc:`ModuleNotFoundError` is raised.  Python implements various
strategies to search for the named module when the import machinery is
invoked.  These strategies can be modified and extended by using various hooks
described in the sections below.

.. versionchanged:: 3.3
   The import system has been updated to fully implement the second phase
   of :pep:`302`. There is no longer any implicit import machinery - the full
   import system is exposed through :data:`sys.meta_path`. In addition,
   native namespace package support has been implemented (see :pep:`420`).


:mod:`importlib`
================

The :mod:`importlib` module provides a rich API for interacting with the
import system.  For example :func:`importlib.import_module` provides a
recommended, simpler API than built-in :func:`__import__` for invoking the
import machinery.  Refer to the :mod:`importlib` library documentation for
additional detail.



Packages
========

.. index::
    single: package

Python has only one type of module object, and all modules are of this type,
regardless of whether the module is implemented in Python, C, or something
else.  To help organize modules and provide a naming hierarchy, Python has a
concept of :term:`packages <package>`.

You can think of packages as the directories on a file system and modules as
files within directories, but don't take this analogy too literally since
packages and modules need not originate from the file system.  For the
purposes of this documentation, we'll use this convenient analogy of
directories and files.  Like file system directories, packages are organized
hierarchically, and packages may themselves contain subpackages, as well as
regular modules.

It's important to keep in mind that all packages are modules, but not all
modules are packages.  Or put another way, packages are just a special kind of
module.  Specifically, any module that contains a ``__path__`` attribute is
considered a package.

All modules have a name.  Subpackage names are separated from their parent
package name by a dot, akin to Python's standard attribute access syntax.  Thus
you might have a package called :mod:`email`, which in turn has a subpackage
called :mod:`email.mime` and a module within that subpackage called
:mod:`email.mime.text`.


Regular packages
----------------

.. index::
    pair: package; regular

Python defines two types of packages, :term:`regular packages <regular
package>` and :term:`namespace packages <namespace package>`.  Regular
packages are traditional packages as they existed in Python 3.2 and earlier.
A regular package is typically implemented as a directory containing an
``__init__.py`` file.  When a regular package is imported, this
``__init__.py`` file is implicitly executed, and the objects it defines are
bound to names in the package's namespace.  The ``__init__.py`` file can
contain the same Python code that any other module can contain, and Python
will add some additional attributes to the module when it is imported.

For example, the following file system layout defines a top level ``parent``
package with three subpackages::

    parent/
        __init__.py
        one/
            __init__.py
        two/
            __init__.py
        three/
            __init__.py

Importing ``parent.one`` will implicitly execute ``parent/__init__.py`` and
``parent/one/__init__.py``.  Subsequent imports of ``parent.two`` or
``parent.three`` will execute ``parent/two/__init__.py`` and
``parent/three/__init__.py`` respectively.


Namespace packages
------------------

.. index::
    pair: package; namespace
    pair: package; portion

A namespace package is a composite of various :term:`portions <portion>`,
where each portion contributes a subpackage to the parent package.  Portions
may reside in different locations on the file system.  Portions may also be
found in zip files, on the network, or anywhere else that Python searches
during import.  Namespace packages may or may not correspond directly to
objects on the file system; they may be virtual modules that have no concrete
representation.

Namespace packages do not use an ordinary list for their ``__path__``
attribute. They instead use a custom iterable type which will automatically
perform a new search for package portions on the next import attempt within
that package if the path of their parent package (or :data:`sys.path` for a
top level package) changes.

With namespace packages, there is no ``parent/__init__.py`` file.  In fact,
there may be multiple ``parent`` directories found during import search, where
each one is provided by a different portion.  Thus ``parent/one`` may not be
physically located next to ``parent/two``.  In this case, Python will create a
namespace package for the top-level ``parent`` package whenever it or one of
its subpackages is imported.

See also :pep:`420` for the namespace package specification.


Searching
=========

To begin the search, Python needs the :term:`fully qualified <qualified name>`
name of the module (or package, but for the purposes of this discussion, the
difference is immaterial) being imported.  This name may come from various
arguments to the :keyword:`import` statement, or from the parameters to the
:func:`importlib.import_module` or :func:`__import__` functions.

This name will be used in various phases of the import search, and it may be
the dotted path to a submodule, e.g. ``foo.bar.baz``.  In this case, Python
first tries to import ``foo``, then ``foo.bar``, and finally ``foo.bar.baz``.
If any of the intermediate imports fail, a :exc:`ModuleNotFoundError` is raised.


The module cache
----------------

.. index::
    single: sys.modules

The first place checked during import search is :data:`sys.modules`.  This
mapping serves as a cache of all modules that have been previously imported,
including the intermediate paths.  So if ``foo.bar.baz`` was previously
imported, :data:`sys.modules` will contain entries for ``foo``, ``foo.bar``,
and ``foo.bar.baz``.  Each key will have as its value the corresponding module
object.

During import, the module name is looked up in :data:`sys.modules` and if
present, the associated value is the module satisfying the import, and the
process completes.  However, if the value is ``None``, then a
:exc:`ModuleNotFoundError` is raised.  If the module name is missing, Python will
continue searching for the module.

:data:`sys.modules` is writable.  Deleting a key may not destroy the
associated module (as other modules may hold references to it),
but it will invalidate the cache entry for the named module, causing
Python to search anew for the named module upon its next
import. The key can also be assigned to ``None``, forcing the next import
of the module to result in a :exc:`ModuleNotFoundError`.

Beware though, as if you keep a reference to the module object,
invalidate its cache entry in :data:`sys.modules`, and then re-import the
named module, the two module objects will *not* be the same. By contrast,
:func:`importlib.reload` will reuse the *same* module object, and simply
reinitialise the module contents by rerunning the module's code.


.. _finders-and-loaders:

Finders and loaders
-------------------

.. index::
    single: finder
    single: loader
    single: module spec

If the named module is not found in :data:`sys.modules`, then Python's import
protocol is invoked to find and load the module.  This protocol consists of
two conceptual objects, :term:`finders <finder>` and :term:`loaders <loader>`.
A finder's job is to determine whether it can find the named module using
whatever strategy it knows about. Objects that implement both of these
interfaces are referred to as :term:`importers <importer>` - they return
themselves when they find that they can load the requested module.

Python includes a number of default finders and importers.  The first one
knows how to locate built-in modules, and the second knows how to locate
frozen modules.  A third default finder searches an :term:`import path`
for modules.  The :term:`import path` is a list of locations that may
name file system paths or zip files.  It can also be extended to search
for any locatable resource, such as those identified by URLs.

The import machinery is extensible, so new finders can be added to extend the
range and scope of module searching.

Finders do not actually load modules.  If they can find the named module, they
return a :dfn:`module spec`, an encapsulation of the module's import-related
information, which the import machinery then uses when loading the module.

The following sections describe the protocol for finders and loaders in more
detail, including how you can create and register new ones to extend the
import machinery.

.. versionchanged:: 3.4
   In previous versions of Python, finders returned :term:`loaders <loader>`
   directly, whereas now they return module specs which *contain* loaders.
   Loaders are still used during import but have fewer responsibilities.

Import hooks
------------

.. index::
   single: import hooks
   single: meta hooks
   single: path hooks
   pair: hooks; import
   pair: hooks; meta
   pair: hooks; path

The import machinery is designed to be extensible; the primary mechanism for
this are the *import hooks*.  There are two types of import hooks: *meta
hooks* and *import path hooks*.

Meta hooks are called at the start of import processing, before any other
import processing has occurred, other than :data:`sys.modules` cache look up.
This allows meta hooks to override :data:`sys.path` processing, frozen
modules, or even built-in modules.  Meta hooks are registered by adding new
finder objects to :data:`sys.meta_path`, as described below.

Import path hooks are called as part of :data:`sys.path` (or
``package.__path__``) processing, at the point where their associated path
item is encountered.  Import path hooks are registered by adding new callables
to :data:`sys.path_hooks` as described below.


The meta path
-------------

.. index::
    single: sys.meta_path
    pair: finder; find_spec

When the named module is not found in :data:`sys.modules`, Python next
searches :data:`sys.meta_path`, which contains a list of meta path finder
objects.  These finders are queried in order to see if they know how to handle
the named module.  Meta path finders must implement a method called
:meth:`~importlib.abc.MetaPathFinder.find_spec()` which takes three arguments:
a name, an import path, and (optionally) a target module.  The meta path
finder can use any strategy it wants to determine whether it can handle
the named module or not.

If the meta path finder knows how to handle the named module, it returns a
spec object.  If it cannot handle the named module, it returns ``None``.  If
:data:`sys.meta_path` processing reaches the end of its list without returning
a spec, then a :exc:`ModuleNotFoundError` is raised.  Any other exceptions
raised are simply propagated up, aborting the import process.

The :meth:`~importlib.abc.MetaPathFinder.find_spec()` method of meta path
finders is called with two or three arguments.  The first is the fully
qualified name of the module being imported, for example ``foo.bar.baz``.
The second argument is the path entries to use for the module search.  For
top-level modules, the second argument is ``None``, but for submodules or
subpackages, the second argument is the value of the parent package's
``__path__`` attribute. If the appropriate ``__path__`` attribute cannot
be accessed, a :exc:`ModuleNotFoundError` is raised.  The third argument
is an existing module object that will be the target of loading later.
The import system passes in a target module only during reload.

The meta path may be traversed multiple times for a single import request.
For example, assuming none of the modules involved has already been cached,
importing ``foo.bar.baz`` will first perform a top level import, calling
``mpf.find_spec("foo", None, None)`` on each meta path finder (``mpf``). After
``foo`` has been imported, ``foo.bar`` will be imported by traversing the
meta path a second time, calling
``mpf.find_spec("foo.bar", foo.__path__, None)``. Once ``foo.bar`` has been
imported, the final traversal will call
``mpf.find_spec("foo.bar.baz", foo.bar.__path__, None)``.

Some meta path finders only support top level imports. These importers will
always return ``None`` when anything other than ``None`` is passed as the
second argument.

Python's default :data:`sys.meta_path` has three meta path finders, one that
knows how to import built-in modules, one that knows how to import frozen
modules, and one that knows how to import modules from an :term:`import path`
(i.e. the :term:`path based finder`).

.. versionchanged:: 3.4
   The :meth:`~importlib.abc.MetaPathFinder.find_spec` method of meta path
   finders replaced :meth:`~importlib.abc.MetaPathFinder.find_module`, which
   is now deprecated.  While it will continue to work without change, the
   import machinery will try it only if the finder does not implement
   ``find_spec()``.

.. versionchanged:: 3.10
   Use of :meth:`~importlib.abc.MetaPathFinder.find_module` by the import system
   now raises :exc:`ImportWarning`.


Loading
=======

If and when a module spec is found, the import machinery will use it (and
the loader it contains) when loading the module.  Here is an approximation
of what happens during the loading portion of import::

    module = None
    if spec.loader is not None and hasattr(spec.loader, 'create_module'):
        # It is assumed 'exec_module' will also be defined on the loader.
        module = spec.loader.create_module(spec)
    if module is None:
        module = ModuleType(spec.name)
    # The import-related module attributes get set here:
    _init_module_attrs(spec, module)

    if spec.loader is None:
        # unsupported
        raise ImportError
    if spec.origin is None and spec.submodule_search_locations is not None:
        # namespace package
        sys.modules[spec.name] = module
    elif not hasattr(spec.loader, 'exec_module'):
        module = spec.loader.load_module(spec.name)
        # Set __loader__ and __package__ if missing.
    else:
        sys.modules[spec.name] = module
        try:
            spec.loader.exec_module(module)
        except BaseException:
            try:
                del sys.modules[spec.name]
            except KeyError:
                pass
            raise
    return sys.modules[spec.name]

Note the following details:

 * If there is an existing module object with the given name in
   :data:`sys.modules`, import will have already returned it.

 * The module will exist in :data:`sys.modules` before the loader
   executes the module code.  This is crucial because the module code may
   (directly or indirectly) import itself; adding it to :data:`sys.modules`
   beforehand prevents unbounded recursion in the worst case and multiple
   loading in the best.

 * If loading fails, the failing module -- and only the failing module --
   gets removed from :data:`sys.modules`.  Any module already in the
   :data:`sys.modules` cache, and any module that was successfully loaded
   as a side-effect, must remain in the cache.  This contrasts with
   reloading where even the failing module is left in :data:`sys.modules`.

 * After the module is created but before execution, the import machinery
   sets the import-related module attributes ("_init_module_attrs" in
   the pseudo-code example above), as summarized in a
   :ref:`later section <import-mod-attrs>`.

 * Module execution is the key moment of loading in which the module's
   namespace gets populated.  Execution is entirely delegated to the
   loader, which gets to decide what gets populated and how.

 * The module created during loading and passed to exec_module() may
   not be the one returned at the end of import [#fnlo]_.

.. versionchanged:: 3.4
   The import system has taken over the boilerplate responsibilities of
   loaders.  These were previously performed by the
   :meth:`importlib.abc.Loader.load_module` method.

Loaders
-------

Module loaders provide the critical function of loading: module execution.
The import machinery calls the :meth:`importlib.abc.Loader.exec_module`
method with a single argument, the module object to execute.  Any value
returned from :meth:`~importlib.abc.Loader.exec_module` is ignored.

Loaders must satisfy the following requirements:

 * If the module is a Python module (as opposed to a built-in module or a
   dynamically loaded extension), the loader should execute the module's code
   in the module's global name space (``module.__dict__``).

 * If the loader cannot execute the module, it should raise an
   :exc:`ImportError`, although any other exception raised during
   :meth:`~importlib.abc.Loader.exec_module` will be propagated.

In many cases, the finder and loader can be the same object; in such cases the
:meth:`~importlib.abc.MetaPathFinder.find_spec` method would just return a
spec with the loader set to ``self``.

Module loaders may opt in to creating the module object during loading
by implementing a :meth:`~importlib.abc.Loader.create_module` method.
It takes one argument, the module spec, and returns the new module object
to use during loading.  ``create_module()`` does not need to set any attributes
on the module object.  If the method returns ``None``, the
import machinery will create the new module itself.

.. versionadded:: 3.4
   The :meth:`~importlib.abc.Loader.create_module` method of loaders.

.. versionchanged:: 3.4
   The :meth:`~importlib.abc.Loader.load_module` method was replaced by
   :meth:`~importlib.abc.Loader.exec_module` and the import
   machinery assumed all the boilerplate responsibilities of loading.

   For compatibility with existing loaders, the import machinery will use
   the ``load_module()`` method of loaders if it exists and the loader does
   not also implement ``exec_module()``.  However, ``load_module()`` has been
   deprecated and loaders should implement ``exec_module()`` instead.

   The ``load_module()`` method must implement all the boilerplate loading
   functionality described above in addition to executing the module.  All
   the same constraints apply, with some additional clarification:

    * If there is an existing module object with the given name in
      :data:`sys.modules`, the loader must use that existing module.
      (Otherwise, :func:`importlib.reload` will not work correctly.)  If the
      named module does not exist in :data:`sys.modules`, the loader
      must create a new module object and add it to :data:`sys.modules`.

    * The module *must* exist in :data:`sys.modules` before the loader
      executes the module code, to prevent unbounded recursion or multiple
      loading.

    * If loading fails, the loader must remove any modules it has inserted
      into :data:`sys.modules`, but it must remove **only** the failing
      module(s), and only if the loader itself has loaded the module(s)
      explicitly.

.. versionchanged:: 3.5
   A :exc:`DeprecationWarning` is raised when ``exec_module()`` is defined but
   ``create_module()`` is not.

.. versionchanged:: 3.6
   An :exc:`ImportError` is raised when ``exec_module()`` is defined but
   ``create_module()`` is not.

.. versionchanged:: 3.10
   Use of ``load_module()`` will raise :exc:`ImportWarning`.

Submodules
----------

When a submodule is loaded using any mechanism (e.g. ``importlib`` APIs, the
``import`` or ``import-from`` statements, or built-in ``__import__()``) a
binding is placed in the parent module's namespace to the submodule object.
For example, if package ``spam`` has a submodule ``foo``, after importing
``spam.foo``, ``spam`` will have an attribute ``foo`` which is bound to the
submodule.  Let's say you have the following directory structure::

    spam/
        __init__.py
        foo.py
        bar.py

and ``spam/__init__.py`` has the following lines in it::

    from .foo import Foo
    from .bar import Bar

then executing the following puts a name binding to ``foo`` and ``bar`` in the
``spam`` module::

    >>> import spam
    >>> spam.foo
    <module 'spam.foo' from '/tmp/imports/spam/foo.py'>
    >>> spam.bar
    <module 'spam.bar' from '/tmp/imports/spam/bar.py'>

Given Python's familiar name binding rules this might seem surprising, but
it's actually a fundamental feature of the import system.  The invariant
holding is that if you have ``sys.modules['spam']`` and
``sys.modules['spam.foo']`` (as you would after the above import), the latter
must appear as the ``foo`` attribute of the former.

Module spec
-----------

The import machinery uses a variety of information about each module
during import, especially before loading.  Most of the information is
common to all modules.  The purpose of a module's spec is to encapsulate
this import-related information on a per-module basis.

Using a spec during import allows state to be transferred between import
system components, e.g. between the finder that creates the module spec
and the loader that executes it.  Most importantly, it allows the
import machinery to perform the boilerplate operations of loading,
whereas without a module spec the loader had that responsibility.

The module's spec is exposed as the ``__spec__`` attribute on a module object.
See :class:`~importlib.machinery.ModuleSpec` for details on the contents of
the module spec.

.. versionadded:: 3.4

.. _import-mod-attrs:

Import-related module attributes
--------------------------------

The import machinery fills in these attributes on each module object
during loading, based on the module's spec, before the loader executes
the module.

.. attribute:: __name__

   The ``__name__`` attribute must be set to the fully-qualified name of
   the module.  This name is used to uniquely identify the module in
   the import system.

.. attribute:: __loader__

   The ``__loader__`` attribute must be set to the loader object that
   the import machinery used when loading the module.  This is mostly
   for introspection, but can be used for additional loader-specific
   functionality, for example getting data associated with a loader.

.. attribute:: __package__

   The module's ``__package__`` attribute must be set.  Its value must
   be a string, but it can be the same value as its ``__name__``.  When
   the module is a package, its ``__package__`` value should be set to
   its ``__name__``.  When the module is not a package, ``__package__``
   should be set to the empty string for top-level modules, or for
   submodules, to the parent package's name.  See :pep:`366` for further
   details.

   This attribute is used instead of ``__name__`` to calculate explicit
   relative imports for main modules, as defined in :pep:`366`. It is
   expected to have the same value as ``__spec__.parent``.

   .. versionchanged:: 3.6
      The value of ``__package__`` is expected to be the same as
      ``__spec__.parent``.

.. attribute:: __spec__

   The ``__spec__`` attribute must be set to the module spec that was
   used when importing the module. Setting ``__spec__``
   appropriately applies equally to :ref:`modules initialized during
   interpreter startup <programs>`.  The one exception is ``__main__``,
   where ``__spec__`` is :ref:`set to None in some cases <main_spec>`.

   When ``__package__`` is not defined, ``__spec__.parent`` is used as
   a fallback.

   .. versionadded:: 3.4

   .. versionchanged:: 3.6
      ``__spec__.parent`` is used as a fallback when ``__package__`` is
      not defined.

.. attribute:: __path__

   If the module is a package (either regular or namespace), the module
   object's ``__path__`` attribute must be set.  The value must be
   iterable, but may be empty if ``__path__`` has no further significance.
   If ``__path__`` is not empty, it must produce strings when iterated
   over. More details on the semantics of ``__path__`` are given
   :ref:`below <package-path-rules>`.

   Non-package modules should not have a ``__path__`` attribute.

.. attribute:: __file__
.. attribute:: __cached__

   ``__file__`` is optional. If set, this attribute's value must be a
   string.  The import system may opt to leave ``__file__`` unset if it
   has no semantic meaning (e.g. a module loaded from a database).

   If ``__file__`` is set, it may also be appropriate to set the
   ``__cached__`` attribute which is the path to any compiled version of
   the code (e.g. byte-compiled file). The file does not need to exist
   to set this attribute; the path can simply point to where the
   compiled file would exist (see :pep:`3147`).

   It is also appropriate to set ``__cached__`` when ``__file__`` is not
   set.  However, that scenario is quite atypical.  Ultimately, the
   loader is what makes use of ``__file__`` and/or ``__cached__``.  So
   if a loader can load from a cached module but otherwise does not load
   from a file, that atypical scenario may be appropriate.

.. _package-path-rules:

module.__path__
---------------

By definition, if a module has a ``__path__`` attribute, it is a package.

A package's ``__path__`` attribute is used during imports of its subpackages.
Within the import machinery, it functions much the same as :data:`sys.path`,
i.e. providing a list of locations to search for modules during import.
However, ``__path__`` is typically much more constrained than
:data:`sys.path`.

``__path__`` must be an iterable of strings, but it may be empty.
The same rules used for :data:`sys.path` also apply to a package's
``__path__``, and :data:`sys.path_hooks` (described below) are
consulted when traversing a package's ``__path__``.

A package's ``__init__.py`` file may set or alter the package's ``__path__``
attribute, and this was typically the way namespace packages were implemented
prior to :pep:`420`.  With the adoption of :pep:`420`, namespace packages no
longer need to supply ``__init__.py`` files containing only ``__path__``
manipulation code; the import machinery automatically sets ``__path__``
correctly for the namespace package.

Module reprs
------------

By default, all modules have a usable repr, however depending on the
attributes set above, and in the module's spec, you can more explicitly
control the repr of module objects.

If the module has a spec (``__spec__``), the import machinery will try
to generate a repr from it.  If that fails or there is no spec, the import
system will craft a default repr using whatever information is available
on the module.  It will try to use the ``module.__name__``,
``module.__file__``, and ``module.__loader__`` as input into the repr,
with defaults for whatever information is missing.

Here are the exact rules used:

 * If the module has a ``__spec__`` attribute, the information in the spec
   is used to generate the repr.  The "name", "loader", "origin", and
   "has_location" attributes are consulted.

 * If the module has a ``__file__`` attribute, this is used as part of the
   module's repr.

 * If the module has no ``__file__`` but does have a ``__loader__`` that is not
   ``None``, then the loader's repr is used as part of the module's repr.

 * Otherwise, just use the module's ``__name__`` in the repr.

.. versionchanged:: 3.4
   Use of :meth:`loader.module_repr() <importlib.abc.Loader.module_repr>`
   has been deprecated and the module spec is now used by the import
   machinery to generate a module repr.

   For backward compatibility with Python 3.3, the module repr will be
   generated by calling the loader's
   :meth:`~importlib.abc.Loader.module_repr` method, if defined, before
   trying either approach described above.  However, the method is deprecated.

.. versionchanged:: 3.10

   Calling :meth:`~importlib.abc.Loader.module_repr` now occurs after trying to
   use a module's ``__spec__`` attribute but before falling back on
   ``__file__``. Use of :meth:`~importlib.abc.Loader.module_repr` is slated to
   stop in Python 3.12.

.. _pyc-invalidation:

Cached bytecode invalidation
----------------------------

Before Python loads cached bytecode from a ``.pyc`` file, it checks whether the
cache is up-to-date with the source ``.py`` file. By default, Python does this
by storing the source's last-modified timestamp and size in the cache file when
writing it. At runtime, the import system then validates the cache file by
checking the stored metadata in the cache file against the source's
metadata.

Python also supports "hash-based" cache files, which store a hash of the source
file's contents rather than its metadata. There are two variants of hash-based
``.pyc`` files: checked and unchecked. For checked hash-based ``.pyc`` files,
Python validates the cache file by hashing the source file and comparing the
resulting hash with the hash in the cache file. If a checked hash-based cache
file is found to be invalid, Python regenerates it and writes a new checked
hash-based cache file. For unchecked hash-based ``.pyc`` files, Python simply
assumes the cache file is valid if it exists. Hash-based ``.pyc`` files
validation behavior may be overridden with the :option:`--check-hash-based-pycs`
flag.

.. versionchanged:: 3.7
   Added hash-based ``.pyc`` files. Previously, Python only supported
   timestamp-based invalidation of bytecode caches.


The Path Based Finder
=====================

.. index::
    single: path based finder

As mentioned previously, Python comes with several default meta path finders.
One of these, called the :term:`path based finder`
(:class:`~importlib.machinery.PathFinder`), searches an :term:`import path`,
which contains a list of :term:`path entries <path entry>`.  Each path
entry names a location to search for modules.

The path based finder itself doesn't know how to import anything. Instead, it
traverses the individual path entries, associating each of them with a
path entry finder that knows how to handle that particular kind of path.

The default set of path entry finders implement all the semantics for finding
modules on the file system, handling special file types such as Python source
code (``.py`` files), Python byte code (``.pyc`` files) and
shared libraries (e.g. ``.so`` files). When supported by the :mod:`zipimport`
module in the standard library, the default path entry finders also handle
loading all of these file types (other than shared libraries) from zipfiles.

Path entries need not be limited to file system locations.  They can refer to
URLs, database queries, or any other location that can be specified as a
string.

The path based finder provides additional hooks and protocols so that you
can extend and customize the types of searchable path entries.  For example,
if you wanted to support path entries as network URLs, you could write a hook
that implements HTTP semantics to find modules on the web.  This hook (a
callable) would return a :term:`path entry finder` supporting the protocol
described below, which was then used to get a loader for the module from the
web.

A word of warning: this section and the previous both use the term *finder*,
distinguishing between them by using the terms :term:`meta path finder` and
:term:`path entry finder`.  These two types of finders are very similar,
support similar protocols, and function in similar ways during the import
process, but it's important to keep in mind that they are subtly different.
In particular, meta path finders operate at the beginning of the import
process, as keyed off the :data:`sys.meta_path` traversal.

By contrast, path entry finders are in a sense an implementation detail
of the path based finder, and in fact, if the path based finder were to be
removed from :data:`sys.meta_path`, none of the path entry finder semantics
would be invoked.


Path entry finders
------------------

.. index::
    single: sys.path
    single: sys.path_hooks
    single: sys.path_importer_cache
    single: PYTHONPATH

The :term:`path based finder` is responsible for finding and loading
Python modules and packages whose location is specified with a string
:term:`path entry`.  Most path entries name locations in the file system,
but they need not be limited to this.

As a meta path finder, the :term:`path based finder` implements the
:meth:`~importlib.abc.MetaPathFinder.find_spec` protocol previously
described, however it exposes additional hooks that can be used to
customize how modules are found and loaded from the :term:`import path`.

Three variables are used by the :term:`path based finder`, :data:`sys.path`,
:data:`sys.path_hooks` and :data:`sys.path_importer_cache`.  The ``__path__``
attributes on package objects are also used.  These provide additional ways
that the import machinery can be customized.

:data:`sys.path` contains a list of strings providing search locations for
modules and packages.  It is initialized from the :data:`PYTHONPATH`
environment variable and various other installation- and
implementation-specific defaults.  Entries in :data:`sys.path` can name
directories on the file system, zip files, and potentially other "locations"
(see the :mod:`site` module) that should be searched for modules, such as
URLs, or database queries.  Only strings and bytes should be present on
:data:`sys.path`; all other data types are ignored.  The encoding of bytes
entries is determined by the individual :term:`path entry finders <path entry
finder>`.

The :term:`path based finder` is a :term:`meta path finder`, so the import
machinery begins the :term:`import path` search by calling the path
based finder's :meth:`~importlib.machinery.PathFinder.find_spec` method as
described previously.  When the ``path`` argument to
:meth:`~importlib.machinery.PathFinder.find_spec` is given, it will be a
list of string paths to traverse - typically a package's ``__path__``
attribute for an import within that package.  If the ``path`` argument is
``None``, this indicates a top level import and :data:`sys.path` is used.

The path based finder iterates over every entry in the search path, and
for each of these, looks for an appropriate :term:`path entry finder`
(:class:`~importlib.abc.PathEntryFinder`) for the
path entry.  Because this can be an expensive operation (e.g. there may be
`stat()` call overheads for this search), the path based finder maintains
a cache mapping path entries to path entry finders.  This cache is maintained
in :data:`sys.path_importer_cache` (despite the name, this cache actually
stores finder objects rather than being limited to :term:`importer` objects).
In this way, the expensive search for a particular :term:`path entry`
location's :term:`path entry finder` need only be done once.  User code is
free to remove cache entries from :data:`sys.path_importer_cache` forcing
the path based finder to perform the path entry search again [#fnpic]_.

If the path entry is not present in the cache, the path based finder iterates
over every callable in :data:`sys.path_hooks`.  Each of the :term:`path entry
hooks <path entry hook>` in this list is called with a single argument, the
path entry to be searched.  This callable may either return a :term:`path
entry finder` that can handle the path entry, or it may raise
:exc:`ImportError`.  An :exc:`ImportError` is used by the path based finder to
signal that the hook cannot find a :term:`path entry finder`
for that :term:`path entry`.  The
exception is ignored and :term:`import path` iteration continues.  The hook
should expect either a string or bytes object; the encoding of bytes objects
is up to the hook (e.g. it may be a file system encoding, UTF-8, or something
else), and if the hook cannot decode the argument, it should raise
:exc:`ImportError`.

If :data:`sys.path_hooks` iteration ends with no :term:`path entry finder`
being returned, then the path based finder's
:meth:`~importlib.machinery.PathFinder.find_spec` method will store ``None``
in :data:`sys.path_importer_cache` (to indicate that there is no finder for
this path entry) and return ``None``, indicating that this
:term:`meta path finder` could not find the module.

If a :term:`path entry finder` *is* returned by one of the :term:`path entry
hook` callables on :data:`sys.path_hooks`, then the following protocol is used
to ask the finder for a module spec, which is then used when loading the
module.

The current working directory -- denoted by an empty string -- is handled
slightly differently from other entries on :data:`sys.path`. First, if the
current working directory is found to not exist, no value is stored in
:data:`sys.path_importer_cache`. Second, the value for the current working
directory is looked up fresh for each module lookup. Third, the path used for
:data:`sys.path_importer_cache` and returned by
:meth:`importlib.machinery.PathFinder.find_spec` will be the actual current
working directory and not the empty string.

Path entry finder protocol
--------------------------

In order to support imports of modules and initialized packages and also to
contribute portions to namespace packages, path entry finders must implement
the :meth:`~importlib.abc.PathEntryFinder.find_spec` method.

:meth:`~importlib.abc.PathEntryFinder.find_spec` takes two arguments: the
fully qualified name of the module being imported, and the (optional) target
module.  ``find_spec()`` returns a fully populated spec for the module.
This spec will always have "loader" set (with one exception).

To indicate to the import machinery that the spec represents a namespace
:term:`portion`, the path entry finder sets "submodule_search_locations" to
a list containing the portion.

.. versionchanged:: 3.4
   :meth:`~importlib.abc.PathEntryFinder.find_spec` replaced
   :meth:`~importlib.abc.PathEntryFinder.find_loader` and
   :meth:`~importlib.abc.PathEntryFinder.find_module`, both of which
   are now deprecated, but will be used if ``find_spec()`` is not defined.

   Older path entry finders may implement one of these two deprecated methods
   instead of ``find_spec()``.  The methods are still respected for the
   sake of backward compatibility.  However, if ``find_spec()`` is
   implemented on the path entry finder, the legacy methods are ignored.

   :meth:`~importlib.abc.PathEntryFinder.find_loader` takes one argument, the
   fully qualified name of the module being imported.  ``find_loader()``
   returns a 2-tuple where the first item is the loader and the second item
   is a namespace :term:`portion`.

   For backwards compatibility with other implementations of the import
   protocol, many path entry finders also support the same,
   traditional ``find_module()`` method that meta path finders support.
   However path entry finder ``find_module()`` methods are never called
   with a ``path`` argument (they are expected to record the appropriate
   path information from the initial call to the path hook).

   The ``find_module()`` method on path entry finders is deprecated,
   as it does not allow the path entry finder to contribute portions to
   namespace packages.  If both ``find_loader()`` and ``find_module()``
   exist on a path entry finder, the import system will always call
   ``find_loader()`` in preference to ``find_module()``.

.. versionchanged:: 3.10
    Calls to :meth:`~importlib.abc.PathEntryFinder.find_module` and
    :meth:`~importlib.abc.PathEntryFinder.find_loader` by the import
    system will raise :exc:`ImportWarning`.


Replacing the standard import system
====================================

The most reliable mechanism for replacing the entire import system is to
delete the default contents of :data:`sys.meta_path`, replacing them
entirely with a custom meta path hook.

If it is acceptable to only alter the behaviour of import statements
without affecting other APIs that access the import system, then replacing
the builtin :func:`__import__` function may be sufficient. This technique
may also be employed at the module level to only alter the behaviour of
import statements within that module.

To selectively prevent the import of some modules from a hook early on the
meta path (rather than disabling the standard import system entirely),
it is sufficient to raise :exc:`ModuleNotFoundError` directly from
:meth:`~importlib.abc.MetaPathFinder.find_spec` instead of returning
``None``. The latter indicates that the meta path search should continue,
while raising an exception terminates it immediately.

.. _relativeimports:

Package Relative Imports
========================

Relative imports use leading dots. A single leading dot indicates a relative
import, starting with the current package. Two or more leading dots indicate a
relative import to the parent(s) of the current package, one level per dot
after the first. For example, given the following package layout::

    package/
        __init__.py
        subpackage1/
            __init__.py
            moduleX.py
            moduleY.py
        subpackage2/
            __init__.py
            moduleZ.py
        moduleA.py

In either ``subpackage1/moduleX.py`` or ``subpackage1/__init__.py``,
the following are valid relative imports::

    from .moduleY import spam
    from .moduleY import spam as ham
    from . import moduleY
    from ..subpackage1 import moduleY
    from ..subpackage2.moduleZ import eggs
    from ..moduleA import foo

Absolute imports may use either the ``import <>`` or ``from <> import <>``
syntax, but relative imports may only use the second form; the reason
for this is that::

    import XXX.YYY.ZZZ

should expose ``XXX.YYY.ZZZ`` as a usable expression, but .moduleY is
not a valid expression.


.. _import-dunder-main:

Special considerations for __main__
===================================

The :mod:`__main__` module is a special case relative to Python's import
system.  As noted :ref:`elsewhere <programs>`, the ``__main__`` module
is directly initialized at interpreter startup, much like :mod:`sys` and
:mod:`builtins`.  However, unlike those two, it doesn't strictly
qualify as a built-in module.  This is because the manner in which
``__main__`` is initialized depends on the flags and other options with
which the interpreter is invoked.

.. _main_spec:

__main__.__spec__
-----------------

Depending on how :mod:`__main__` is initialized, ``__main__.__spec__``
gets set appropriately or to ``None``.

When Python is started with the :option:`-m` option, ``__spec__`` is set
to the module spec of the corresponding module or package. ``__spec__`` is
also populated when the ``__main__`` module is loaded as part of executing a
directory, zipfile or other :data:`sys.path` entry.

In :ref:`the remaining cases <using-on-interface-options>`
``__main__.__spec__`` is set to ``None``, as the code used to populate the
:mod:`__main__` does not correspond directly with an importable module:

- interactive prompt
- :option:`-c` option
- running from stdin
- running directly from a source or bytecode file

Note that ``__main__.__spec__`` is always ``None`` in the last case,
*even if* the file could technically be imported directly as a module
instead. Use the :option:`-m` switch if valid module metadata is desired
in :mod:`__main__`.

Note also that even when ``__main__`` corresponds with an importable module
and ``__main__.__spec__`` is set accordingly, they're still considered
*distinct* modules. This is due to the fact that blocks guarded by
``if __name__ == "__main__":`` checks only execute when the module is used
to populate the ``__main__`` namespace, and not during normal import.


Open issues
===========

XXX It would be really nice to have a diagram.

XXX * (import_machinery.rst) how about a section devoted just to the
attributes of modules and packages, perhaps expanding upon or supplanting the
related entries in the data model reference page?

XXX runpy, pkgutil, et al in the library manual should all get "See Also"
links at the top pointing to the new import system section.

XXX Add more explanation regarding the different ways in which
``__main__`` is initialized?

XXX Add more info on ``__main__`` quirks/pitfalls (i.e. copy from
:pep:`395`).


References
==========

The import machinery has evolved considerably since Python's early days.  The
original `specification for packages
<https://www.python.org/doc/essays/packages/>`_ is still available to read,
although some details have changed since the writing of that document.

The original specification for :data:`sys.meta_path` was :pep:`302`, with
subsequent extension in :pep:`420`.

:pep:`420` introduced :term:`namespace packages <namespace package>` for
Python 3.3.  :pep:`420` also introduced the :meth:`find_loader` protocol as an
alternative to :meth:`find_module`.

:pep:`366` describes the addition of the ``__package__`` attribute for
explicit relative imports in main modules.

:pep:`328` introduced absolute and explicit relative imports and initially
proposed ``__name__`` for semantics :pep:`366` would eventually specify for
``__package__``.

:pep:`338` defines executing modules as scripts.

:pep:`451` adds the encapsulation of per-module import state in spec
objects.  It also off-loads most of the boilerplate responsibilities of
loaders back onto the import machinery.  These changes allow the
deprecation of several APIs in the import system and also addition of new
methods to finders and loaders.

.. rubric:: Footnotes

.. [#fnmo] See :class:`types.ModuleType`.

.. [#fnlo] The importlib implementation avoids using the return value
   directly. Instead, it gets the module object by looking the module name up
   in :data:`sys.modules`.  The indirect effect of this is that an imported
   module may replace itself in :data:`sys.modules`.  This is
   implementation-specific behavior that is not guaranteed to work in other
   Python implementations.

.. [#fnpic] In legacy code, it is possible to find instances of
   :class:`imp.NullImporter` in the :data:`sys.path_importer_cache`.  It
   is recommended that code be changed to use ``None`` instead.  See
   :ref:`portingpythoncode` for more details.
