This commit is contained in:
jxxghp
2024-05-10 20:09:45 +08:00
parent 3d5761157a
commit 0e9e626ab6
2 changed files with 17 additions and 9 deletions

View File

@ -3,7 +3,6 @@ import concurrent.futures
import os import os
import time import time
import traceback import traceback
from pathlib import Path
from typing import List, Any, Dict, Tuple, Optional from typing import List, Any, Dict, Tuple, Optional
from watchdog.events import FileSystemEventHandler from watchdog.events import FileSystemEventHandler
@ -43,7 +42,7 @@ class PluginMonitorHandler(FileSystemEventHandler):
try: try:
# 使用os.path和pathlib处理跨平台的路径问题 # 使用os.path和pathlib处理跨平台的路径问题
plugin_dir = event.src_path.split("plugins" + os.sep)[1].split(os.sep)[0] plugin_dir = event.src_path.split("plugins" + os.sep)[1].split(os.sep)[0]
init_file = Path(settings.ROOT_PATH) / "app" / "plugins" / plugin_dir / "__init__.py" init_file = settings.ROOT_PATH / "app" / "plugins" / plugin_dir / "__init__.py"
with open(init_file, "r", encoding="utf-8") as f: with open(init_file, "r", encoding="utf-8") as f:
lines = f.readlines() lines = f.readlines()
pid = None pid = None
@ -91,18 +90,27 @@ class PluginManager(metaclass=Singleton):
启动加载插件 启动加载插件
:param pid: 插件ID为空加载所有插件 :param pid: 插件ID为空加载所有插件
""" """
def check_module(module: Any):
"""
检查模块
"""
if not hasattr(module, 'init_plugin') or not hasattr(module, "plugin_name"):
return False
return True
# 扫描插件目录 # 扫描插件目录
plugin_package = "app.plugins"
if pid: if pid:
# 加载指定插件
plugins = ModuleHelper.load_with_pre_filter( plugins = ModuleHelper.load_with_pre_filter(
"app.plugins", "app.plugins",
filter_func=lambda name, obj: filter_func=lambda name, obj: check_module(obj) and name == pid
hasattr(obj, 'init_plugin') and hasattr(obj, "plugin_name") and name == pid
) )
else: else:
# 加载所有插件
plugins = ModuleHelper.load( plugins = ModuleHelper.load(
"app.plugins", "app.plugins",
filter_func=lambda _, obj: hasattr(obj, 'init_plugin') and hasattr(obj, "plugin_name") filter_func=lambda _, obj: check_module(obj)
) )
# 已安装插件 # 已安装插件
installed_plugins = self.systemconfig.get(SystemConfigKey.UserInstalledPlugins) or [] installed_plugins = self.systemconfig.get(SystemConfigKey.UserInstalledPlugins) or []

View File

@ -13,9 +13,9 @@ class ModuleHelper:
""" """
@classmethod @classmethod
def load(cls, package_path, filter_func=lambda name, obj: True): def load(cls, package_path: str, filter_func=lambda name, obj: True):
""" """
导入模块 导入模块
:param package_path: 父包名 :param package_path: 父包名
:param filter_func: 子模块过滤函数入参为模块名和模块对象返回True则导入否则不导入 :param filter_func: 子模块过滤函数入参为模块名和模块对象返回True则导入否则不导入
:return: :return:
@ -41,7 +41,7 @@ class ModuleHelper:
return submodules return submodules
@classmethod @classmethod
def load_with_pre_filter(cls, package_path, filter_func=lambda name, obj: True): def load_with_pre_filter(cls, package_path: str, filter_func=lambda name, obj: True):
""" """
导入子模块 导入子模块
:param package_path: 父包名 :param package_path: 父包名