Entrypoints
The `entrypoints` library facilitates the discovery and loading of entry points advertised by installed Python packages. It offers a lightweight and faster alternative to `pkg_resources` for this specific functionality, avoiding the full package scans that can slow down `pkg_resources` at import time. The current version is 0.4. The package is in maintenance-only mode, with new code advised to use the `importlib.metadata` module from the Python standard library for entry point management.
Common errors
-
AttributeError: 'EntryPoints' object has no attribute 'get'
cause This error typically occurs when using an older API for accessing entry points (like `get()`) on an `EntryPoints` object, which has changed its interface in `importlib-metadata` versions 5.0 and higher. The `entrypoints` library itself is in maintenance mode and newer Python versions often implicitly use `importlib.metadata`.fixPin your `importlib-metadata` package to version 4.13.0 or earlier (`pip install 'importlib-metadata<5'`). Alternatively, if using `importlib.metadata` directly, adopt the modern `select()` method to retrieve entry points by group or name, rather than dictionary-like access. -
ModuleNotFoundError: No module named 'your_package_name' (when running a console_script)
cause This usually happens when a console script defined in `pyproject.toml` or `setup.py` (which internally uses entry points) cannot find the module it's supposed to execute. This can be due to incorrect package structure, missing `__init__.py` files, or the package not being properly installed in the environment where the script is run.fixEnsure your package has `__init__.py` files in all its directories to be recognized as a package. Verify the module path specified in your `console_scripts` entry point (e.g., `my_script=my_package.module:function`) is correct and that the package is installed in the active Python environment (use `pip install -e .` for development installs). -
DeprecationWarning: SelectableGroups dict interface is deprecated. Use select().
cause This warning indicates that code is using a dictionary-like interface on the `EntryPoints` object, which is being phased out in `importlib.metadata` (and thus affects `entrypoints` usage as well). While currently a warning, it will become an `AttributeError` in future versions.fixRefactor your code to use the `select()` method on the `EntryPoints` object to filter by group or name. For example, instead of `entry_points()['my_group']`, use `entry_points(group='my_group')` or `entry_points().select(group='my_group')`.
Warnings
- breaking The `entrypoints` package is in maintenance-only mode. New code should use `importlib.metadata` (part of the Python standard library since 3.8, non-provisional since 3.10) for discovering and loading entry points. For Python versions older than 3.8, consider using the `importlib_metadata` backport.
- gotcha When multiple versions of the same distribution are present in different directories on `sys.path`, `entrypoints` follows a 'first one wins' rule. This typically aligns with Python's import logic, but can lead to unexpected behavior if specific versions are expected.
- gotcha `entrypoints` relies on `pip` (or similar tools) to ensure only one `.dist-info` or `.egg-info` directory exists for each installed package. If this assumption is violated, there's no reliable way to pick the correct metadata, which can lead to incorrect entry point resolution.
Install
-
pip install entrypoints
Imports
- get_group_all
from entrypoints import get_group_all
- get_group_named
from entrypoints import get_group_named
- EntryPoint
from entrypoints import EntryPoint
Quickstart
from entrypoints import get_group_all
# Example: Find all 'console_scripts' entry points
console_scripts = get_group_all('console_scripts')
print(f"Found {len(console_scripts)} console scripts:")
for ep in console_scripts:
print(f" - {ep.name}: {ep.module}.{ep.attr}")
try:
# Load the entry point (e.g., a function)
loaded_object = ep.load()
# You can then call the loaded_object if it's a function
# print(f" Loaded object: {loaded_object}")
except Exception as e:
print(f" Could not load {ep.name}: {e}")