.. _entry_point:
Entry Points in Python
======================
The first paragraph taken from `python's specifications for entry-points `_.
..
Entry points are a mechanism for an installed distribution to advertise components it provides to be discovered and used by other code. For example:
#. Distributions can specify console_scripts entry points, each referring to a function.
When pip (or another console_scripts aware installer) installs the distribution, it will create a command-line wrapper for each entry point.
#. Applications can use entry points to load plugins; e.g. ``Pygments`` (a syntax highlighting tool) can use additional lexers and styles from separately installed packages.
For more about this, see `Creating and discovering plugins `_.
The entry point file format was originally developed to allow packages built with ``setuptools`` to provide integration point metadata that would be read at runtime with ``importlib.metadata``.
It is now defined as a ``PyPA`` interoperability specification in order to allow build tools other than ``setuptools`` to publish ``importlib.metadata`` compatible entry point metadata, and runtime libraries other than ``importlib.metadata`` to portably read published entry point metadata (potentially with different caching and conflict resolution strategies).
Please refer to `python's specifications for entry-points `_ for information about entry-points in ``python``.
Example Package with Entry Point
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here is a very briefed walk-through of the adding an entry point in a python package.
First of all is the (minimal) required structure of the package, the structure should contain (at least) the following files:
#. ``pyproject.toml`` or ``setup.cfg`` or ``setup.py`` (can be a combination of those as well).
In this example we use ``pyproject.toml``.
#. The actual code of the package.
In this example it's ``example.py`` & ``__init__.py``.
.. code-block:: text
example-package/
├── pyproject.toml
└── src
└── example
├── example.py
└── __init__.py
The "magic" happens in the ``pyproject.toml``, which would contain the following section:
.. code-block:: toml
[project.entry-points."example.group"]
hello = "example.example:hello"
This section in the ``pyproject.toml`` will install an entry-point **named** ``hello`` in a **group** named ``example.group``.
This entry-point is a pointer to a function called ``hello`` which is imported as follows:
.. code-block:: python
from exmaple.example import hello
(At least is an equivalent to this ``import`` statement).