Files
work-secretfile-selfcheck/UmiOCR-data/py_src/plugins_controller/plugins_controller.py

85 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =======================================
# =============== 加载插件 ===============
# =======================================
import os
import site
import importlib
from umi_log import logger
from ..ocr.api import initOcrPlugins
# 插件 总目录
PLUGINS_PATH = "plugins"
# 插件组 组名
PLUGINS_GROUPS = ["ocr"]
# 插件控制器
class _PluginsControllerClass:
def __init__(self):
self.pluginsDict = {}
self.optionsDict = {}
for group in PLUGINS_GROUPS:
self.pluginsDict[group] = {}
self.optionsDict[group] = {}
# 初始化并加载插件
def init(self):
# 动态插件
errors = {} # 保存失败信息
# 添加包搜索路径
if not os.path.exists(PLUGINS_PATH):
os.makedirs(PLUGINS_PATH)
logger.error(f"插件目录不存在: {PLUGINS_PATH} ")
return None
site.addsitedir(PLUGINS_PATH) # 添加插件搜索路径
# 加载所有插件。在插件目录中搜索合法的包
plugList = os.listdir(PLUGINS_PATH)
for name in plugList:
initPath = os.path.join(PLUGINS_PATH, name, "__init__.py")
if os.path.exists(initPath): # 若包路径下存在 __init__.py ,则尝试加载该包
flag, res = self._loadPlugin(name)
if not flag: # 失败
errors[name] = res
logger.error(f"加载插件 {name} 失败:{res}")
# TODO: 静态插件
# 动态插件导入API管理器
ocrErrs = initOcrPlugins(self.pluginsDict["ocr"])
if ocrErrs:
errors.update(ocrErrs)
return {"options": self.optionsDict, "errors": errors}
# 加载一个组件python包。成功返回True失败返回 False, 错误信息
def _loadPlugin(self, name):
# 加载包
try:
module = importlib.import_module(name)
except Exception as e:
return False, f"动态导入包失败:{e}"
# 验证信息
if not hasattr(module, "PluginInfo"):
return False, f"__init__.py 中未定义 PluginInfo 。"
pluginInfo = module.PluginInfo
if "group" not in pluginInfo:
return False, f"__init__.py 中未定义 group 。"
if "api_class" not in pluginInfo:
return False, f"__init__.py 中未定义 api_class 。"
if "global_options" not in pluginInfo:
pluginInfo["global_options"] = None
if "local_options" not in pluginInfo:
pluginInfo["local_options"] = None
group = pluginInfo["group"]
if not group or group not in PLUGINS_GROUPS:
return False, f'__init__.py group "{group}" 不属于已定义的插件类型。'
# 加载成功、验证成功,则记录信息
self.pluginsDict[group][name] = pluginInfo
self.optionsDict[group][name] = {
"global_options": pluginInfo["global_options"],
"local_options": pluginInfo["local_options"],
}
return True, ""
PluginsController = _PluginsControllerClass()