# core/plugin_reloader.py import sys import importlib from vs_log_macros import VSC_INFO, VSC_WARN def reload_plugin_module(plugin_name: str): """ 强制卸载并重载插件模块,实现 OTA 热更新 """ # 1. 在 sys.modules 中查找相关模块 # 插件可能导入了其他子模块,这里简单处理:移除主插件模块 # 如果插件有 __init__.py 且是一个包,逻辑类似 modules_to_remove = [] for mod_name in sys.modules.keys(): # 假设插件名就是模块名,或者模块名以插件名开头 # 例如 plugin_name="bls_plugin", 模块可能是 "plugins.bls_plugin" if plugin_name in mod_name: modules_to_remove.append(mod_name) if not modules_to_remove: VSC_WARN("reloader", f"Plugin module '{plugin_name}' not found in memory. First load?") return # 2. 移除模块 for mod in modules_to_remove: try: del sys.modules[mod] VSC_INFO("reloader", f"Unloaded module: {mod}") except Exception as e: VSC_WARN("reloader", f"Failed to unload {mod}: {e}") # 3. 强制垃圾回收 (可选,依赖引用计数) import gc gc.collect() VSC_INFO("reloader", f"Plugin '{plugin_name}' reloaded (ready for fresh import).")