
本文介绍了如何使用 Setuptools 正确注册多个 Pluggy 插件,以便它们可以协同工作。核心在于理解 Pluggy 插件的命名规则,以及如何通过 Entry Points 将插件正确地注册到 PluginManager 中。通过修改 `pyproject.toml` 文件中的 Entry Point 名称,确保每个插件都有唯一的名称,从而实现多个插件的串行执行。## Pluggy 插件注册原理Pluggy 允许开发者创建可扩展的应用程序,通过插件机制增加功能。在使用 `load_setuptools_entrypoints` 函数加载插件时,Pluggy 依赖于 Setuptools 的 Entry Points 机制。理解 Entry Points 的工作方式是成功注册多个插件的关键。每个插件都需要在 `pyproject.toml`(或 `setup.py`)文件中定义一个 Entry Point。Entry Point 声明了插件的入口点,Pluggy 通过这些入口点找到并加载插件。## 解决插件冲突问题在使用 `load_setuptools_entrypoints` 时,如果多个插件使用相同的 Entry Point 名称,Pluggy 只会注册最后一个加载的插件。这是因为 Pluggy 内部使用插件名称作为唯一标识符。为了解决这个问题,必须确保每个插件都有唯一的 Entry Point 名称。这意味着,在 `pyproject.toml` 文件中,`[project.entry-points.pluggable]` 下的每个条目都应该有不同的名称。## 正确配置 pyproject.toml以下是如何修改 `plugin_a/pyproject.toml` 和 `plugin_b/pyproject.toml` 文件,以确保每个插件都有唯一名称的示例:**plugin_a/pyproject.toml:**“`toml[project]name = “plugin_a”version = “1.0.0”dependencies = [“pluggy==1.3.0”, “pluggable”][project.entry-points.pluggable]plugin_a = “a” # 修改 entry point 名称为 plugin_a
plugin_b/pyproject.toml:
[project]name = "plugin_b"version = "1.0.0"dependencies = ["pluggy==1.3.0", "pluggable"][project.entry-points.pluggable]plugin_b = "b" # 修改 entry point 名称为 plugin_b
注意,Entry Point 的名称(例如 plugin_a 和 plugin_b)需要与插件的实际名称相对应,并且必须是唯一的。
修改 Pluggable 主程序
虽然不是强制性的,但建议在 pluggable.py 中使用 add_hookspecs() 方法将 hook 规范添加到 PluginManager 中。这有助于 Pluggy 验证插件实现是否符合规范。
# pluggable/pluggable.pyimport pluggyNAME = "pluggable"impl = pluggy.HookimplMarker(NAME)@pluggy.HookspecMarker(NAME)def run_plugin(): passdef main(): m = pluggy.PluginManager(NAME) m.add_hookspecs(sys.modules[__name__]) # 添加 hook 规范 m.load_setuptools_entrypoints(NAME) m.hook.run_plugin()if __name__ == "__main__": import sys main()
验证插件注册
完成上述修改后,重新安装插件并运行 pluggable.py,应该能够看到两个插件都成功运行:
$ python -m venv venv...$ venv/bin/pip install -e pluggable -e plugin_a -e plugin_b...Successfully installed pluggable-1.0.0 plugin-a-1.0.0 plugin-b-1.0.0$ venv/bin/python pluggable/pluggable.pyrun from brun from a
注意事项
插件命名: 确保每个插件都有唯一的名称,这包括 pyproject.toml 文件中的 name 字段和 Entry Point 的名称。Hook 规范: 建议使用 add_hookspecs() 方法将 hook 规范添加到 PluginManager 中,以提高代码的健壮性。依赖管理: 确保所有插件都声明了正确的依赖关系,包括 pluggy 和宿主应用程序。
总结
通过正确配置 pyproject.toml 文件中的 Entry Points,可以成功注册多个 Pluggy 插件,并使它们协同工作。关键在于确保每个插件都有唯一的名称,并遵循 Pluggy 的插件注册规则。遵循这些步骤,可以构建可扩展且灵活的应用程序。
以上就是# 使用 Setuptools 注册多个 Pluggy 插件的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369569.html
微信扫一扫
支付宝扫一扫


