diff --git a/plugin_common/plugin_manager.py b/plugin_common/plugin_manager.py index 4a1ea70..aeb12b3 100644 --- a/plugin_common/plugin_manager.py +++ b/plugin_common/plugin_manager.py @@ -86,7 +86,7 @@ class PluginManager: self.start_plugin(plugin.name) except Exception as e: self.LOG.error(f"PluginManager:加载插件 {plugin_name} 时发生错误: {str(e)}", exc_info=True) - + self.LOG.info(f"PluginManager:成功加载插件: {loaded_plugins}") return self.plugins @@ -107,14 +107,14 @@ class PluginManager: if module_name == plugin_name: self.LOG.info(f"PluginManager:插件模块 {plugin_name} 已加载为 {name}") return plugin - + # 如果插件已加载,直接返回 if plugin_name in self.plugins: return self.plugins[plugin_name] - + # 确定插件路径和模块路径 plugin_path = os.path.join(self.plugin_dir, plugin_name) - + # 加载模块 if os.path.isdir(plugin_path) and os.path.exists(os.path.join(plugin_path, "main.py")): # 目录插件,从main.py加载 @@ -134,18 +134,18 @@ class PluginManager: except ImportError as e: self.LOG.error(f"PluginManager:导入单文件插件 {plugin_name} 失败: {e}") return None - + # 查找插件类 plugin_class = None for name, obj in inspect.getmembers(module): - if (inspect.isclass(obj) and - issubclass(obj, PluginInterface) and - obj != PluginInterface and - obj != MessagePluginInterface and - obj != ScheduledPluginInterface): + if (inspect.isclass(obj) and + issubclass(obj, PluginInterface) and + obj != PluginInterface and + obj != MessagePluginInterface and + obj != ScheduledPluginInterface): plugin_class = obj break - + # 如果没有找到插件类,尝试查找get_plugin函数 if plugin_class is None: get_plugin_func = getattr(module, "get_plugin", None) @@ -154,69 +154,69 @@ class PluginManager: if isinstance(plugin, PluginInterface): # 设置插件路径 plugin.set_plugin_path(plugin_path) - + # 加载插件配置 if not plugin.load_config(): self.LOG.error(f"PluginManager:插件 {plugin_name} 加载配置失败") return None - + # 初始化插件 if not plugin.initialize(self.system_context): self.LOG.error(f"PluginManager:插件 {plugin_name} 初始化失败") return None - + # 注册插件 PluginRegistry().register(plugin) - + # 存储插件实例 self.plugins[plugin.name] = plugin - + # 发布插件加载事件 EventSystem().publish(EventType.PLUGIN_LOADED, {"plugin": plugin}) - + return plugin else: self.LOG.error(f"PluginManager:插件 {plugin_name} 的 get_plugin() 返回的不是有效的插件实例") else: self.LOG.error(f"PluginManager:插件 {plugin_name} 中未找到有效的插件类或 get_plugin 函数") return None - + # 实例化插件 plugin = plugin_class() plugin.status = PluginStatus.LOADED - + # 设置插件路径 plugin.set_plugin_path(plugin_path) - + # 加载插件配置 if not plugin.load_config(): self.LOG.error(f"PluginManager:插件 {plugin_name} 加载配置失败") return None - + # 初始化插件 if not plugin.initialize(self.system_context): self.LOG.error(f"PluginManager:插件 {plugin_name} 初始化失败") return None - + # 注册插件 PluginRegistry().register(plugin) - + # 在 load_plugin 方法中,修改存储插件实例的部分 # 存储插件实例 self.plugins[plugin.name] = plugin - + # 添加模块名到插件名的映射 try: module_name = plugin.__class__.__module__.split('.')[-2] self.module_to_plugin[module_name] = plugin.name except (IndexError, AttributeError): self.LOG.warning(f"无法为插件 {plugin.name} 获取有效的模块名") - + # 发布插件加载事件 EventSystem().publish(EventType.PLUGIN_LOADED, {"plugin": plugin}) - + return plugin - + except Exception as e: self.LOG.error(f"PluginManager:加载插件 {plugin_name} 失败: {e}", exc_info=True) return None @@ -233,29 +233,29 @@ class PluginManager: """ # 查找插件 display_name, plugin = self.find_plugin_by_name(plugin_name) - + if not plugin: self.LOG.info(f"PluginManager:插件 {plugin_name} 未加载") return False - + # 停止插件 if plugin.status == PluginStatus.RUNNING: if not plugin.stop(): self.LOG.info(f"PluginManager:停止插件 {display_name} 失败") return False plugin.status = PluginStatus.STOPPED # 确保状态更新 - + # 清理插件资源 if not plugin.cleanup(): self.LOG.info(f"PluginManager:清理插件 {display_name} 资源失败") return False - + # 设置状态为未加载 plugin.status = PluginStatus.UNLOADED - + # 注销插件 PluginRegistry().unregister(display_name) - + # 获取模块名,用于清理映射 try: module_name = plugin.__class__.__module__.split('.')[-2] @@ -264,13 +264,13 @@ class PluginManager: del self.module_to_plugin[module_name] except (IndexError, AttributeError): pass - + # 移除插件实例 del self.plugins[display_name] - + # 发布插件卸载事件 EventSystem().publish(EventType.PLUGIN_UNLOADED, {"plugin_name": display_name}) - + return True def reload_plugin(self, plugin_name: str) -> Optional[PluginInterface]: @@ -285,11 +285,11 @@ class PluginManager: """ # 查找插件 display_name, plugin = self.find_plugin_by_name(plugin_name) - + if not plugin: self.LOG.info(f"PluginManager:插件 {plugin_name} 未加载,无法重载") return None - + # 记录原插件状态和模块名 was_running = plugin.status == PluginStatus.RUNNING try: @@ -297,12 +297,12 @@ class PluginManager: except (IndexError, AttributeError): self.LOG.error(f"无法获取插件 {display_name} 的模块名,重载失败") return None - + # 卸载插件 if not self.unload_plugin(display_name): self.LOG.info(f"卸载插件 {display_name} 失败,无法重载") return None - + # 重新导入模块 if module_name in self.plugin_modules: try: @@ -310,14 +310,14 @@ class PluginManager: except Exception as e: self.LOG.info(f"重新导入插件模块 {module_name} 失败: {e}") return None - + # 加载插件 plugin = self.load_plugin(module_name) - + # 如果原来是运行状态,则重新启动 if plugin and was_running: self.start_plugin(plugin.name) - + return plugin def start_plugin(self, plugin_name: str) -> bool: @@ -332,7 +332,7 @@ class PluginManager: """ # 查找插件 display_name, plugin = self.find_plugin_by_name(plugin_name) - + if not plugin: self.LOG.info(f"PluginManager:插件 {plugin_name} 未加载") return False @@ -362,7 +362,7 @@ class PluginManager: """ # 查找插件 display_name, plugin = self.find_plugin_by_name(plugin_name) - + if not plugin: self.LOG.info(f"插件 {plugin_name} 未加载") return False @@ -390,48 +390,48 @@ class PluginManager: success = True # 创建插件名称的副本,因为在卸载过程中会修改self.plugins字典 plugin_names = list(self.plugins.keys()) - + for plugin_name in plugin_names: if not self.unload_plugin(plugin_name): self.LOG.error(f"卸载插件 {plugin_name} 失败") success = False - + # 清空插件模块字典 self.plugin_modules.clear() - + # 确保插件字典为空 if self.plugins: self.LOG.warning(f"插件卸载后仍有 {len(self.plugins)} 个插件残留") success = False - + return success def find_plugin_by_name(self, plugin_name: str) -> Tuple[Optional[str], Optional[PluginInterface]]: - """ - 根据插件名称或模块名查找插件 - - Args: - plugin_name: 插件名称或模块名 - - Returns: - (插件显示名称, 插件实例) 元组,未找到返回 (None, None) - """ - # 直接通过显示名称查找 - if plugin_name in self.plugins: - return plugin_name, self.plugins[plugin_name] - - # 通过模块名查找 - if plugin_name in self.module_to_plugin: - display_name = self.module_to_plugin[plugin_name] - return display_name, self.plugins.get(display_name) - - # 遍历所有插件查找匹配的模块名 - for name, plugin in self.plugins.items(): - try: - module_name = plugin.__class__.__module__.split('.')[-2] - if module_name == plugin_name: - return name, plugin - except (IndexError, AttributeError): - continue - - return None, None + """ + 根据插件名称或模块名查找插件 + + Args: + plugin_name: 插件名称或模块名 + + Returns: + (插件显示名称, 插件实例) 元组,未找到返回 (None, None) + """ + # 直接通过显示名称查找 + if plugin_name in self.plugins: + return plugin_name, self.plugins[plugin_name] + + # 通过模块名查找 + if plugin_name in self.module_to_plugin: + display_name = self.module_to_plugin[plugin_name] + return display_name, self.plugins.get(display_name) + + # 遍历所有插件查找匹配的模块名 + for name, plugin in self.plugins.items(): + try: + module_name = plugin.__class__.__module__.split('.')[-2] + if module_name == plugin_name: + return name, plugin + except (IndexError, AttributeError): + continue + + return None, None