| 12345678910111213141516171819202122232425262728293031323334353637 |
- # 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).")
|