Browse Source

修改插件目录格式,无需划分子目录,用配置文件来标注插件组别

release/2.0.0
unknown 2 years ago
parent
commit
6ee6bbe895
  1. 6
      .vscode/settings.json
  2. 0
      UmiOCR-data/py_src/imports/call_func.py
  3. 0
      UmiOCR-data/py_src/imports/i18n.py
  4. 71
      UmiOCR-data/py_src/plugins_controller/plugins_controller.py
  5. 2
      UmiOCR-data/py_src/run.py
  6. 17
      UmiOCR-data/qt_res/qml/ApiManager/OcrManager.qml
  7. 42
      UmiOCR-data/qt_res/qml/Configs/GlobalConfigs.qml

6
.vscode/settings.json

@ -1,10 +1,12 @@
{
//
"python.autoComplete.extraPaths": [
"./UmiOCR-data/site-packages"
"./UmiOCR-data/site-packages",
"./UmiOCR-data/py_src/imports",
],
"python.analysis.extraPaths": [
"./UmiOCR-data/site-packages"
"./UmiOCR-data/site-packages",
"./UmiOCR-data/py_src/imports",
],
"editor.suggest.showWords": true,
"cmake.configureOnOpen": false,

0
UmiOCR-data/plugins/call_func.py → UmiOCR-data/py_src/imports/call_func.py

0
UmiOCR-data/plugins/translate.py → UmiOCR-data/py_src/imports/i18n.py

71
UmiOCR-data/py_src/plugins_controller/plugins_controller.py

@ -7,11 +7,9 @@ import site
import importlib
from ..ocr.api import initOcrPlugins
OCR_PLUGINS_PATH = "plugins/ocr"
# 插件 总目录
PLUGINS_PATH = "plugins"
# 插件组 目录
# 插件组
PLUGINS_GROUPS = ["ocr"]
@ -19,61 +17,66 @@ 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):
# 动态插件
options = {} # 保存成功加载的插件的配置
errors = {} # 保存失败信息
# 添加包搜索路径
if not os.path.exists(PLUGINS_PATH):
os.makedirs(PLUGINS_PATH)
print(f"[Error] 插件目录不存在: {PLUGINS_PATH} ")
return
site.addsitedir(PLUGINS_PATH)
for group in PLUGINS_GROUPS:
options[group] = {}
plugGroupPath = os.path.join(PLUGINS_PATH, group)
if not os.path.exists(plugGroupPath):
print(f"[Error] {plugGroupPath} 插件组目录不存在: {plugGroupPath} ")
continue
site.addsitedir(plugGroupPath)
# 加载所有插件组。在插件组目录中搜索合法的包
plugList = os.listdir(plugGroupPath)
for name in plugList:
initPath = os.path.join(plugGroupPath, name, "__init__.py")
if os.path.exists(initPath): # 若包路径下存在 __init__.py ,则尝试加载该包
flag, res = self._loadPlugin(group, name)
if flag: # 成功
options[group][name] = res
else: # 失败
errors[name] = res
print(f"[Error] 加载插件 {name} 失败:{res}")
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
print(f"[Error] 加载插件 {name} 失败:{res}")
# TODO: 静态插件
# 动态插件导入API管理器
initOcrPlugins(self.pluginsDict["ocr"])
return {"options": options, "errors": errors}
ocrErrs = initOcrPlugins(self.pluginsDict["ocr"])
if ocrErrs:
errors.update(ocrErrs)
return {"options": self.optionsDict, "errors": errors}
# 加载一个组件python包
def _loadPlugin(self, group, name):
# 加载一个组件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"
return False, f"__init__.py 中未定义 PluginInfo"
pluginInfo = module.PluginInfo
for i in ["global_options", "local_options", "api_class"]:
if i not in pluginInfo:
return False, f"PluginInfo 中未定义 {i}"
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
opt = {
self.optionsDict[group][name] = {
"global_options": pluginInfo["global_options"],
"local_options": pluginInfo["local_options"],
}
return True, opt
return True, ""
PluginsController = _PluginsControllerClass()

2
UmiOCR-data/py_src/run.py

@ -1,5 +1,6 @@
import os
import sys
import site
import version as V
from .utils import pre_configs
from .server.cmd_client import initCmd
@ -90,6 +91,7 @@ def main():
app_website = V.WEBSITE # 网站
app_path = os.environ.get("PYSTAND", "") # 程序入口路径
app_home = os.environ.get("PYSTAND_HOME", "") # 程序入口目录
site.addsitedir("py_src/imports") # 自定义库添加到搜索路径
# 调试模式下,手动补充参数
if not app_path:
app_path = os.path.abspath("../Umi-OCR.exe")

17
UmiOCR-data/qt_res/qml/ApiManager/OcrManager.qml

@ -137,11 +137,20 @@ Item {
for (var key in options) {
const gOpt = options[key].global_options
const lOpt = options[key].local_options
globalOptions.api.optionsList.push([key, gOpt.title])
globalOptions[key] = gOpt
localOptions[key] = lOpt
if(gOpt) { //
globalOptions.api.optionsList.push([key, gOpt.title])
globalOptions[key] = gOpt
}
else { //
globalOptions.api.optionsList.push([key, key])
globalOptions[key] = {"title":key, "type":"group"}
}
if(lOpt) //
localOptions[key] = lOpt
else //
localOptions[key] = {"title":key, "type":"group"}
}
return globalOptions
qmlapp.globalConfigs.configDict.ocr = globalOptions //
}
// 2
function init2() {

42
UmiOCR-data/qt_res/qml/Configs/GlobalConfigs.qml

@ -194,23 +194,13 @@ Configs {
Component.onCompleted: {
//
theme.manager.init()
//
let pluginInfos = pluginsConnector.init()
//
const errors = pluginInfos.errors
if(Object.keys(errors).length > 0) {
let msg = ""
for (var key in errors) {
msg += `${key}: ${errors[key]}\n`
}
qmlapp.popup.message(qsTr("插件加载失败"), msg, "error")
}
//
// OCR
configDict.ocr = ocrManager.init1(pluginInfos.options.ocr)
//
initPlugins()
//
reload()
ocrManager.init2(pluginInfos.options.ocr)
// OCR
if(configDict.ocr)
ocrManager.init2()
console.log("% GlobalConfig 初始化全局配置完毕!")
//
Qt.callLater(()=>{
@ -220,6 +210,28 @@ Configs {
})
}
//
function initPlugins() {
//
let pluginInfos = pluginsConnector.init()
if(!pluginInfos) return false //
//
if(pluginInfos.errors && Object.keys(pluginInfos.errors).length > 0) {
const errs = pluginInfos.errors
let msg = ""
for (let key in errs) {
msg += `${key}: ${errs[key]}\n`
}
qmlapp.popup.message(qsTr("插件加载失败"), msg, "error")
}
//
if(pluginInfos.options) {
// OCR
if(pluginInfos.options.ocr)
ocrManager.init1(pluginInfos.options.ocr)
}
}
// /
function changeShortcut(flag, position) {
if(flag) {

Loading…
Cancel
Save