plugin_reloader.py 1.3 KB

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