简单插件系统
extensions的Python项目详细描述
扩展是一个简单的插件系统,灵感来自setuptools入口点 [1]。它允许应用程序定义和/或使用插件。
- 代码基:http://bitbucket.org/tarek/extensions
- 网址:http://pypi.python.org/pypi/extensions
- 反馈:tarek@ziade.org
内容
How to define a plugin
插件可以是任何可调用的对象。必须通过 扩展名注册表。
例如,让我们使用一个简单的函数来计算
一些数字,并将其保存到名为extensions.py的文件中
名为myapp的包
此功能可以使用寄存器在插件系统中注册
功能。插件有一个名称,属于组。为了我们
例如,组可以是myapp.operator和名称average: 第三个参数给出了可调用的位置
模块名:attrs,其中模块名是模块的全名,
以及模块中的属性。 注意,组名包括包的名称,这是一个很好的
练习避免冲突,因为组名对所有应用程序都是全局的
使用扩展名的。 有另一种方法可以使用配置文件注册插件。
您可以编写一个类似ini的文件,使用groups作为sections title,并且name=location
为了价值观。 例如,如果创建包含以下内容的operators.cfg文件: 您可以使用register_file: 此函数将扫描您的文件并为您注册插件。def average(*args):
return sum(args) / len(args)
from extensions import register
# usage : register(group, name, location)
register('myapp.operator', 'average', 'myapp.extensions:average')
Using a configuration file
[myapp.operator]
average = myapp.extensions:average
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入口点。
References
[1] | http://peak.telecommunity.com/DevCenter/setuptools#extensible-applications-and-frameworks |