简单插件系统

extensions的Python项目详细描述


扩展是一个简单的插件系统,灵感来自setuptools入口点 [1]。它允许应用程序定义和/或使用插件。

How to define a plugin

插件可以是任何可调用的对象。必须通过 扩展名注册表。

例如,让我们使用一个简单的函数来计算 一些数字,并将其保存到名为extensions.py的文件中 名为myapp的包

def average(*args):
     return sum(args) / len(args)

此功能可以使用寄存器在插件系统中注册 功能。插件有一个名称,属于。为了我们 例如,组可以是myapp.operator和名称average

from extensions import register

# usage : register(group, name, location)
register('myapp.operator', 'average', 'myapp.extensions:average')

第三个参数给出了可调用的位置 模块名:attrs,其中模块名是模块的全名, 以及模块中的属性。

注意,组名包括包的名称,这是一个很好的 练习避免冲突,因为组名对所有应用程序都是全局的 使用扩展名的。

Using a configuration file

有另一种方法可以使用配置文件注册插件。 您可以编写一个类似ini的文件,使用groups作为sections title,并且name=location 为了价值观。

例如,如果创建包含以下内容的operators.cfg文件:

[myapp.operator]

average = myapp.extensions:average

您可以使用register_file

from extensions import register_file

register_file('operators.cfg')

此函数将扫描您的文件并为您注册插件。

How to use a plugin

Iterate over registered plugins

扩展提供了一个get函数,允许您遍历所有 为给定组注册的插件:

from extensions import get

for plugin in get(group='myapp.operator'):
    print plugin.name

您还可以将名称指定给函数:

for plugin in get(group='myapp.operator', name='average'):
     print plugin.name

或者甚至遍历all插件:

from itertools import islice

for plugin in islice(get(), 5):
    print plugin.name

The Plugin object

函数返回的对象是类实例。

插件类提供了一个名为load的方法,该方法返回 注册的对象,以便您可以使用它

# let's get the plugin `average` of the group `myapp.operator`
plugin = get(group='myapp.operator', name='average').next()

# let's load it
func = plugin.load()

# let's use it now
average = func(1, 2, 3)

插件还提供一个名称和一个属性,对应于 注册插件的名称,以及它的

Distribute your plugins

如果你想分发你的插件,你只需要导入模块 将插件注册到setup.py文件:

from distutils.core import setup
from myapp import plugins  # registers the plugins

setup(name='myapp', version='1.0'
      packages=['myapp'])

当通过创建 当 您的程序包已安装。

Compatibility with setuptools entry points

扩展名与setuptools入口点完全兼容。所以你可以迭代 并使用在安装的第三方应用程序中定义的入口点 在你的Python身上。

如果要遍历setuptools入口点,请使用 调用get函数时使用入口点选项:

plugins = get(consume_entry_points=True)

这将遍历扩展名插件setuptools入口点。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java获取JEditorPane中字符的绝对位置   java Datetime:将时间段拆分为天、小时和分钟   java是使此HashMap更高效的一种方法   java项目reactor:collectList()之后的block()对Flux不起作用。创建()   java在Mac OSX上安装OpenCV   java递归地确定一组数字是否包含两个总和相等的子集   Quad2D曲线上的几何图形Java绘图箭头   java将SSL证书导入Glassfish 4。十、   java Android未找到处理Intent MediaScanner的活动   EclipseJava。安全cert.CertificateParsingException:java。木卫一。IOException:主题密钥,无法创建EC公钥   java我能在O(M log N)时间内完成吗?   java跟踪eclipse中的资源更改也在中。元数据和。项目   java如何完全禁用Android键盘   java返回到上一个活动