为我的Python框架启用插件的正确方法是什么?

时间:2018-09-04 08:40:24

标签: python python-3.x plugins setuptools packaging

我已经对此进行了很长时间的搜索,但似乎找不到关于如何执行以下操作的权威指南:

  • 我正在编写一个Python Publisher-Subscriber框架
  • 我想随我的框架一起运送一些订户
  • 订户生活在一个包裹中,例如framework.subscribers
  • 所有订阅者都继承自的Subscriber基类也位于framework.subscribers
  • 我希望其他人能够提供插件,即编写自己的订阅者,然后在系统范围(或用户范围内,具体取决于python环境)(在安装插件之后)进行访问

guide on packaging列出了不同的方法,没有很好的示例(从框架和插件的角度来看),并且没有说明哪种方法适合哪种情况。

直觉上,我希望安装的插件也可以从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进行访问。

这种方法有问题吗,应该如何正确实现插件支持?

0 个答案:

没有答案