Я долго гуглял по этому вопросу, и я не могу найти полное руководство о том, как сделать следующее:
- Я пишу платформу Python Publisher-Subscriber
- Я бы хотел отправить несколько подписчиков с моей структурой
- Подписчики живут в пакете, скажем,
framework.subscribers
- Базовый класс
Subscriber
, от которого наследуются все подписчики, также находится в framework.subscribers
- Я хочу, чтобы другие могли предоставлять плагины, то есть писать своих собственных подписчиков, к которым затем можно получить доступ (после установки плагина) по всей системе (или по всему пользователю, в зависимости от среды Python)
В руководстве по упаковке перечислены различные методы без хороших примеров (как с точки зрения фреймворка, так и с точки зрения плагина) и не сказано, какой метод подходит для каких случаев.
Интуитивно, я ожидаю, что установленный плагин также будет импортирован из framework.subscribers
. Это хороший способ думать об этом? В настоящее время я понял это так в framework.subscriber.__init__.py
import importlib
import pkg_resources
from .subscriber import Subscriber
__all__ = ['Subscriber']
subscribers = {
entry_point.name: entry_point.load()
for entry_point in pkg_resources.iter_entry_points('framework.subscriber')
}
__all__.extend(list(subscribers.keys()))
for name, clazz in subscribers.items():
locals()[clazz.__name__] = getattr(importlib.import_module(clazz.__module__), clazz.__name__)
В моем setup.py
для фреймворка я регистрирую все свои классы подписчиков с помощью
entry_points={
'framework.subscriber': [
'FooSubscriber = framework.subscriber.foo:FooSubscriber',
]
}
и может делать то же самое из других проектов, которые должны предоставлять плагины.
Затем я могу получить к ним доступ как framework.subscriber.BlaSubscriber
, даже если они на самом деле не определены в файле framework.subscriber.bla.py
или чем-то еще.
Является ли этот подход проблематичным, и как правильно реализовать поддержку плагинов?