48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
import importlib
|
|
import os
|
|
import pkgutil
|
|
import sys
|
|
|
|
|
|
from core.command_manager import matcher
|
|
|
|
|
|
def load_all_plugins():
|
|
"""
|
|
扫描并加载当前包下所有的插件(支持文件和文件夹)
|
|
|
|
该函数会遍历当前目录下的所有模块:
|
|
1. 如果模块已加载,则执行 reload 操作(用于热重载)
|
|
2. 如果模块未加载,则执行 import 操作
|
|
|
|
加载过程中会打印详细的日志信息。
|
|
"""
|
|
package_name = __package__
|
|
package_path = [os.path.dirname(__file__)]
|
|
|
|
print(f" 正在从 {package_name} 加载插件...")
|
|
|
|
for loader, module_name, is_pkg in pkgutil.iter_modules(package_path):
|
|
full_module_name = f"{package_name}.{module_name}"
|
|
|
|
try:
|
|
if full_module_name in sys.modules:
|
|
module = importlib.reload(sys.modules[full_module_name])
|
|
action = "重载"
|
|
else:
|
|
module = importlib.import_module(full_module_name)
|
|
action = "加载"
|
|
|
|
# 提取插件元数据
|
|
if hasattr(module, "__plugin_meta__"):
|
|
meta = getattr(module, "__plugin_meta__")
|
|
matcher.plugins[full_module_name] = meta
|
|
|
|
type_str = "包" if is_pkg else "文件"
|
|
print(f" [{type_str}] 成功{action}: {module_name}")
|
|
except Exception as e:
|
|
print(f" {action if 'action' in locals() else '加载'}插件 {module_name} 失败: {e}")
|
|
|
|
|
|
load_all_plugins()
|