85 lines
3.1 KiB
Python
85 lines
3.1 KiB
Python
# =======================================
|
||
# =============== 加载插件 ===============
|
||
# =======================================
|
||
|
||
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()
|