diff --git a/plugin_common/plugin_manager.py b/plugin_common/plugin_manager.py index 1eef48d..466a4e3 100644 --- a/plugin_common/plugin_manager.py +++ b/plugin_common/plugin_manager.py @@ -78,8 +78,11 @@ class PluginManager: for plugin_name in plugin_modules: try: - if self.load_plugin(plugin_name): + plugin = self.load_plugin(plugin_name) + if plugin: loaded_plugins.append(plugin_name) + # 自动启动插件 + self.start_plugin(plugin.name) except Exception as e: self.LOG.error(f"PluginManager:加载插件 {plugin_name} 时发生错误: {str(e)}", exc_info=True) @@ -215,31 +218,72 @@ class PluginManager: if plugin_name not in self.plugins: self.LOG.info(f"PluginManager:插件 {plugin_name} 未加载") return False - + plugin = self.plugins[plugin_name] - + # 停止插件 if plugin.status == PluginStatus.RUNNING: if not plugin.stop(): self.LOG.info(f"PluginManager:停止插件 {plugin_name} 失败") return False - + plugin.status = PluginStatus.STOPPED # 确保状态更新 + # 清理插件资源 if not plugin.cleanup(): self.LOG.info(f"PluginManager:清理插件 {plugin_name} 资源失败") return False - + + # 设置状态为未加载 + plugin.status = PluginStatus.UNLOADED + # 注销插件 PluginRegistry().unregister(plugin_name) - + # 移除插件实例 del self.plugins[plugin_name] - + # 发布插件卸载事件 EventSystem().publish(EventType.PLUGIN_UNLOADED, {"plugin_name": plugin_name}) - + return True + def reload_plugin(self, plugin_name: str) -> Optional[PluginInterface]: + """ + 重新加载插件 + + Args: + plugin_name: 插件名称 + + Returns: + 插件实例,重新加载失败返回None + """ + # 记录原插件状态 + was_running = False + if plugin_name in self.plugins: + was_running = self.plugins[plugin_name].status == PluginStatus.RUNNING + + # 卸载插件 + if not self.unload_plugin(plugin_name): + self.LOG.info(f"卸载插件 {plugin_name} 失败") + return None + + # 重新导入模块 + if plugin_name in self.plugin_modules: + try: + importlib.reload(self.plugin_modules[plugin_name]) + except Exception as e: + self.LOG.info(f"重新导入插件模块 {plugin_name} 失败: {e}") + return None + + # 加载插件 + plugin = self.load_plugin(plugin_name) + + # 如果原来是运行状态,则重新启动 + if plugin and was_running: + self.start_plugin(plugin.name) + + return plugin + def start_plugin(self, plugin_name: str) -> bool: """ 启动插件