0

0

Python stevedore 的扩展加载实践

舞夢輝影

舞夢輝影

发布时间:2026-02-17 01:19:35

|

522人浏览过

|

来源于php中文网

原创

stevedore加载插件失败的根本原因是插件未正确安装或入口点未注册:插件须为合法包、父目录在sys.path中,且需通过pip install -e .安装并确保pyproject.toml中entry-points配置正确。

python stevedore 的扩展加载实践

stevedore 如何加载插件模块而不报 RuntimeError: No module named

根本原因是 stevedore 默认只从 sys.path 里找包,不会自动把当前目录或自定义路径加进去。你本地写的插件模块如果没安装(即没走 pip install -e .),它就压根看不见。

实操建议:

立即学习Python免费学习笔记(深入)”;

Delphi 7应用编程150例 全书内容 CHM版
Delphi 7应用编程150例 全书内容 CHM版

Delphi 7应用编程150例 CHM全书内容下载,全书主要通过150个实例,全面、深入地介绍了用Delphi 7开发应用程序的常用方法和技巧,主要讲解了用Delphi 7进行界面效果处理、图像处理、图形与多媒体开发、系统功能控制、文件处理、网络与数据库开发,以及组件应用等内容。这些实例简单实用、典型性强、功能突出,很多实例使用的技术稍加扩展可以解决同类问题。使用本书最好的方法是通过学习掌握实例中的技术或技巧,然后使用这些技术尝试实现更复杂的功能并应用到更多方面。本书主要针对具有一定Delphi基础知识

下载
  • 插件模块必须以合法 Python 包形式存在:含 __init__.py,且父目录在 sys.path 中;推荐用 pathlib.Path(__file__).parent.parent 动态加入路径
  • 避免直接改 sys.path.append('./plugins') —— 路径写死、跨平台易错,改用 importlib.util.spec_from_file_location() 手动导入单个文件更可控
  • 检查入口点(entry point)是否注册正确:不是在代码里写死,而是在 setup.pypyproject.toml[project.entry-points."my.plugin.group"] 下声明

为什么 ExtensionManager 找不到已注册的入口点

常见现象是调用 manager.map() 后返回空列表,或初始化时报 No matching plugin found。这不是 stevedore 的 bug,而是入口点未被 Python 的 importlib.metadata(或旧版 pkg_resources)发现。

实操建议:

立即学习Python免费学习笔记(深入)”;

  • 确认插件包已通过 pip install -e . 安装(开发模式),不能只靠 python myapp.py 就指望它自动加载
  • 运行 python -m pip list | grep your-plugin-name 看是否真在已安装包列表中;没出现说明注册失败
  • python -m importlib.metadata entry_points --group=my.plugin.group(Python ≥3.10)验证入口点是否被识别;若无输出,问题出在打包配置
  • PyPI 包名和 setup.py 中的 name= 必须一致,大小写敏感,且不能含下划线(PEP 508 规定仅允许 ASCII 字母、数字、连字符)

DriverManagerNamedExtensionManager 选哪个

二者核心区别不在功能强弱,而在“如何定位插件”:前者靠名字字符串匹配驱动名(如 'json'),后者靠显式传入名称列表做白名单过滤。选错会导致加载逻辑僵硬或漏加载。

实操建议:

立即学习Python免费学习笔记(深入)”;

  • DriverManager 当你需要类似 driver = DriverManager('serializer', 'json') 这种按需取一个的场景;它内部会查所有入口点,挑第一个匹配 name
  • NamedExtensionManager 当你要限定只加载某几个明确命名的插件(比如只允许 ['yaml', 'toml']),避免用户传入非法名导致静默失败
  • 注意 DriverManager 不校验插件是否存在 —— 传入不存在的名字只会返回空扩展对象,不报错;而 NamedExtensionManager 遇到未注册名会直接抛 RuntimeError
  • 性能上差别极小,但 NamedExtensionManager 初始化时就得扫描全部入口点,而 DriverManager 是惰性查找,首次 map()map_method() 才触发

插件函数返回值被包装成 Extension 对象,怎么拿到原始结果

stevedore 把每个插件封装成 Extension 实例,里面存着 .plugin(函数对象)、.name(名字)、.entry_point(入口点信息)。新手常误以为 manager.map(lambda ext: ext()) 就能执行,其实 ext 不是函数,不能直接调。

实操建议:

立即学习Python免费学习笔记(深入)”;

  • 正确调用方式是 ext.plugin(*args, **kwargs),不是 ext(*args, **kwargs)
  • manager.map(lambda ext: ext.plugin(data)) 比较直观;如果想保留插件名上下文,用 manager.items() 得到 (name, ext) 元组
  • 别在插件函数里抛未捕获异常 —— map() 遇到任一插件崩溃就会中断整个遍历;改用 manager.map_method('handle', data) 并确保插件方法有基础异常兜底
  • 如果插件函数需要访问配置或上下文,不要依赖全局变量;通过 manager 初始化时传入 invoke_on_load=True + invoke_args 参数透传
事情说清了就结束。最常卡住的地方其实是入口点注册和包安装状态不一致 —— 本地改了 pyproject.toml 却忘了重装,或者用了 venv 没激活,这些比 API 用法更容易让人花半天时间来回试。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

441

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

321

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

348

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

425

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

786

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

356

2025.07.23

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号