ErisPulse 2.3.4.dev0__py3-none-any.whl → 2.3.4.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ErisPulse/{utils/cli → CLI}/__init__.py +1 -1
- ErisPulse/{utils/cli → CLI}/__init__.pyi +1 -1
- ErisPulse/{utils/cli/__main__.py → CLI/cli.py} +3 -4
- ErisPulse/{utils/cli/__main__.pyi → CLI/cli.pyi} +2 -3
- ErisPulse/{utils/cli → CLI}/commands/init.py +4 -9
- ErisPulse/{utils/cli → CLI}/commands/init.pyi +2 -14
- ErisPulse/{utils/cli → CLI}/commands/install.py +2 -7
- ErisPulse/{utils/cli → CLI}/commands/install.pyi +2 -14
- ErisPulse/{utils/cli → CLI}/commands/list.py +2 -7
- ErisPulse/{utils/cli → CLI}/commands/list.pyi +2 -14
- ErisPulse/{utils/cli → CLI}/commands/list_remote.py +2 -7
- ErisPulse/{utils/cli → CLI}/commands/list_remote.pyi +2 -14
- ErisPulse/{utils/cli → CLI}/commands/run.py +3 -7
- ErisPulse/{utils/cli → CLI}/commands/run.pyi +2 -11
- ErisPulse/{utils/cli → CLI}/commands/self_update.py +2 -7
- ErisPulse/{utils/cli → CLI}/commands/self_update.pyi +2 -14
- ErisPulse/{utils/cli → CLI}/commands/uninstall.py +1 -6
- ErisPulse/{utils/cli → CLI}/commands/uninstall.pyi +1 -14
- ErisPulse/{utils/cli → CLI}/commands/upgrade.py +1 -7
- ErisPulse/{utils/cli → CLI}/commands/upgrade.pyi +1 -14
- ErisPulse/{utils → CLI/utils}/__init__.py +1 -5
- ErisPulse/{utils → CLI/utils}/__init__.pyi +0 -2
- ErisPulse/{utils → CLI/utils}/package_manager.py +146 -20
- ErisPulse/{utils → CLI/utils}/package_manager.pyi +20 -3
- ErisPulse/{utils → CLI/utils}/reload_handler.py +7 -8
- ErisPulse/{utils → CLI/utils}/reload_handler.pyi +1 -1
- ErisPulse/Core/Bases/manager.py +136 -0
- ErisPulse/Core/Bases/manager.pyi +108 -0
- ErisPulse/Core/Bases/module.py +53 -1
- ErisPulse/Core/Bases/module.pyi +43 -0
- ErisPulse/Core/Event/command.py +6 -1
- ErisPulse/Core/_self_config.py +1 -1
- ErisPulse/Core/adapter.py +70 -10
- ErisPulse/Core/adapter.pyi +18 -1
- ErisPulse/Core/exceptions.py +4 -2
- ErisPulse/Core/lifecycle.py +9 -0
- ErisPulse/Core/logger.py +21 -15
- ErisPulse/Core/logger.pyi +2 -1
- ErisPulse/Core/module.py +57 -9
- ErisPulse/Core/module.pyi +12 -1
- ErisPulse/Core/router.py +13 -5
- ErisPulse/Core/storage.py +94 -256
- ErisPulse/Core/storage.pyi +13 -66
- ErisPulse/__init__.py +35 -1237
- ErisPulse/__init__.pyi +3 -290
- ErisPulse/__main__.py +1 -1
- ErisPulse/__main__.pyi +1 -1
- ErisPulse/loaders/__init__.py +22 -0
- ErisPulse/loaders/__init__.pyi +21 -0
- ErisPulse/loaders/adapter_loader.py +187 -0
- ErisPulse/loaders/adapter_loader.pyi +82 -0
- ErisPulse/loaders/base_loader.py +162 -0
- ErisPulse/loaders/base_loader.pyi +23 -0
- ErisPulse/loaders/initializer.py +150 -0
- ErisPulse/loaders/initializer.pyi +60 -0
- ErisPulse/loaders/module_loader.py +618 -0
- ErisPulse/loaders/module_loader.pyi +179 -0
- ErisPulse/loaders/strategy.py +129 -0
- ErisPulse/loaders/strategy.pyi +90 -0
- ErisPulse/sdk.py +435 -0
- ErisPulse/sdk.pyi +158 -0
- {erispulse-2.3.4.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/METADATA +1 -1
- erispulse-2.3.4.dev2.dist-info/RECORD +103 -0
- ErisPulse/sdk_protocol.py +0 -143
- ErisPulse/sdk_protocol.pyi +0 -97
- erispulse-2.3.4.dev0.dist-info/RECORD +0 -89
- /ErisPulse/{utils/cli → CLI}/base.py +0 -0
- /ErisPulse/{utils/cli → CLI}/base.pyi +0 -0
- /ErisPulse/{utils/cli → CLI}/commands/__init__.py +0 -0
- /ErisPulse/{utils/cli → CLI}/commands/__init__.pyi +0 -0
- /ErisPulse/{utils → CLI}/console.py +0 -0
- /ErisPulse/{utils → CLI}/console.pyi +0 -0
- /ErisPulse/{utils/cli → CLI}/registry.py +0 -0
- /ErisPulse/{utils/cli → CLI}/registry.pyi +0 -0
- {erispulse-2.3.4.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/WHEEL +0 -0
- {erispulse-2.3.4.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/entry_points.txt +0 -0
- {erispulse-2.3.4.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ErisPulse 基础加载器
|
|
3
|
+
|
|
4
|
+
定义加载器的抽象基类,提供通用的加载器接口和结构
|
|
5
|
+
|
|
6
|
+
{!--< tips >!--}
|
|
7
|
+
1. 所有具体加载器应继承自 BaseLoader
|
|
8
|
+
2. 子类需实现 _process_entry_point 方法
|
|
9
|
+
3. 支持启用/禁用配置管理
|
|
10
|
+
{!--< /tips >!--}
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import importlib.metadata
|
|
14
|
+
from abc import ABC, abstractmethod
|
|
15
|
+
from typing import Dict, List, Any, Type, Tuple
|
|
16
|
+
from ..Core.logger import logger
|
|
17
|
+
from ..Core.config import config
|
|
18
|
+
|
|
19
|
+
class BaseLoader(ABC):
|
|
20
|
+
"""
|
|
21
|
+
基础加载器抽象类
|
|
22
|
+
|
|
23
|
+
提供通用的加载器接口和配置管理功能
|
|
24
|
+
|
|
25
|
+
{!--< tips >!--}
|
|
26
|
+
子类需要实现:
|
|
27
|
+
- _get_entry_point_group: 返回 entry-point 组名
|
|
28
|
+
- _process_entry_point: 处理单个 entry-point
|
|
29
|
+
- _should_eager_load: 判断是否立即加载
|
|
30
|
+
{!--< /tips >!--}
|
|
31
|
+
|
|
32
|
+
{!--< internal-use >!--}
|
|
33
|
+
此类仅供内部使用,不应直接实例化
|
|
34
|
+
{!--< /internal-use >!--}
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self, config_prefix: str):
|
|
38
|
+
"""
|
|
39
|
+
初始化基础加载器
|
|
40
|
+
|
|
41
|
+
:param config_prefix: 配置前缀(如 "ErisPulse.adapters" 或 "ErisPulse.modules")
|
|
42
|
+
"""
|
|
43
|
+
self._config_prefix = config_prefix
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
def _get_entry_point_group(self) -> str:
|
|
47
|
+
"""
|
|
48
|
+
获取 entry-point 组名
|
|
49
|
+
|
|
50
|
+
:return: entry-point 组名
|
|
51
|
+
|
|
52
|
+
{!--< internal-use >!--}
|
|
53
|
+
子类必须实现此方法
|
|
54
|
+
{!--< /internal-use >!--}
|
|
55
|
+
"""
|
|
56
|
+
pass
|
|
57
|
+
|
|
58
|
+
@abstractmethod
|
|
59
|
+
async def _process_entry_point(
|
|
60
|
+
self,
|
|
61
|
+
entry_point: Any,
|
|
62
|
+
objs: Dict[str, Any],
|
|
63
|
+
enabled_list: List[str],
|
|
64
|
+
disabled_list: List[str],
|
|
65
|
+
manager_instance: Any
|
|
66
|
+
) -> Tuple[Dict[str, Any], List[str], List[str]]:
|
|
67
|
+
"""
|
|
68
|
+
处理单个 entry-point
|
|
69
|
+
|
|
70
|
+
:param entry_point: entry-point 对象
|
|
71
|
+
:param objs: 对象字典
|
|
72
|
+
:param enabled_list: 启用列表
|
|
73
|
+
:param disabled_list: 禁用列表
|
|
74
|
+
:param manager_instance: 管理器实例(用于调用 exists/is_enabled 等方法)
|
|
75
|
+
:return: (更新后的对象字典, 更新后的启用列表, 更新后的禁用列表)
|
|
76
|
+
|
|
77
|
+
{!--< internal-use >!--}
|
|
78
|
+
子类必须实现此方法
|
|
79
|
+
{!--< /internal-use >!--}
|
|
80
|
+
"""
|
|
81
|
+
pass
|
|
82
|
+
|
|
83
|
+
async def load(self, manager_instance: Any) -> Tuple[Dict[str, Any], List[str], List[str]]:
|
|
84
|
+
"""
|
|
85
|
+
从 entry-points 加载对象
|
|
86
|
+
|
|
87
|
+
:param manager_instance: 管理器实例
|
|
88
|
+
:return:
|
|
89
|
+
Dict[str, Any]: 对象字典
|
|
90
|
+
List[str]: 启用列表
|
|
91
|
+
List[str]: 禁用列表
|
|
92
|
+
|
|
93
|
+
:raises ImportError: 当加载失败时抛出
|
|
94
|
+
"""
|
|
95
|
+
objs: Dict[str, Any] = {}
|
|
96
|
+
enabled_list: List[str] = []
|
|
97
|
+
disabled_list: List[str] = []
|
|
98
|
+
|
|
99
|
+
group_name = self._get_entry_point_group()
|
|
100
|
+
logger.info(f"正在加载 {group_name} entry-points...")
|
|
101
|
+
|
|
102
|
+
try:
|
|
103
|
+
# 加载 entry-points
|
|
104
|
+
entry_points = importlib.metadata.entry_points()
|
|
105
|
+
if hasattr(entry_points, 'select'):
|
|
106
|
+
entries = entry_points.select(group=group_name)
|
|
107
|
+
else:
|
|
108
|
+
entries = entry_points.get(group_name, []) # type: ignore[attr-defined]
|
|
109
|
+
|
|
110
|
+
# 处理每个 entry-point
|
|
111
|
+
for entry_point in entries:
|
|
112
|
+
objs, enabled_list, disabled_list = await self._process_entry_point(
|
|
113
|
+
entry_point, objs, enabled_list, disabled_list, manager_instance
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
logger.info(f"{group_name} 加载完成")
|
|
117
|
+
|
|
118
|
+
except Exception as e:
|
|
119
|
+
logger.error(f"加载 {group_name} entry-points 失败: {e}")
|
|
120
|
+
raise ImportError(f"无法加载 {group_name}: {e}")
|
|
121
|
+
|
|
122
|
+
return objs, enabled_list, disabled_list
|
|
123
|
+
|
|
124
|
+
def _register_config(self, name: str, enabled: bool = False) -> bool:
|
|
125
|
+
"""
|
|
126
|
+
注册配置项
|
|
127
|
+
|
|
128
|
+
:param name: 名称
|
|
129
|
+
:param enabled: 是否启用
|
|
130
|
+
:return: 操作是否成功
|
|
131
|
+
|
|
132
|
+
{!--< internal-use >!--}
|
|
133
|
+
内部方法,用于注册新的配置项
|
|
134
|
+
{!--< /internal-use >!--}
|
|
135
|
+
"""
|
|
136
|
+
config_key = f"{self._config_prefix}.status.{name}"
|
|
137
|
+
config.setConfig(config_key, enabled)
|
|
138
|
+
status = "启用" if enabled else "禁用"
|
|
139
|
+
logger.info(f"{self._config_prefix} {name} 已注册并{status}")
|
|
140
|
+
return True
|
|
141
|
+
|
|
142
|
+
def _get_config_status(self, name: str) -> bool:
|
|
143
|
+
"""
|
|
144
|
+
获取配置状态
|
|
145
|
+
|
|
146
|
+
:param name: 名称
|
|
147
|
+
:return: 是否启用
|
|
148
|
+
|
|
149
|
+
{!--< internal-use >!--}
|
|
150
|
+
内部方法,用于获取配置状态
|
|
151
|
+
{!--< /internal-use >!--}
|
|
152
|
+
"""
|
|
153
|
+
config_key = f"{self._config_prefix}.status.{name}"
|
|
154
|
+
status = config.getConfig(config_key)
|
|
155
|
+
|
|
156
|
+
if status is None:
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
if isinstance(status, str):
|
|
160
|
+
return status.lower() not in ('false', '0', 'no', 'off')
|
|
161
|
+
|
|
162
|
+
return bool(status)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for base_loader.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
ErisPulse 基础加载器
|
|
9
|
+
|
|
10
|
+
定义加载器的抽象基类,提供通用的加载器接口和结构
|
|
11
|
+
|
|
12
|
+
{!--< tips >!--}
|
|
13
|
+
1. 所有具体加载器应继承自 BaseLoader
|
|
14
|
+
2. 子类需实现 _process_entry_point 方法
|
|
15
|
+
3. 支持启用/禁用配置管理
|
|
16
|
+
{!--< /tips >!--}
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import importlib.metadata
|
|
20
|
+
from abc import ABC, abstractmethod
|
|
21
|
+
from typing import Dict, List, Any, Type, Tuple
|
|
22
|
+
from ..Core.logger import logger
|
|
23
|
+
from ..Core.config import config
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ErisPulse 初始化协调器
|
|
3
|
+
|
|
4
|
+
负责协调适配器和模块的加载流程
|
|
5
|
+
|
|
6
|
+
{!--< tips >!--}
|
|
7
|
+
1. 初始化顺序:适配器 → 模块
|
|
8
|
+
2. 支持并行加载优化
|
|
9
|
+
3. 统一的错误处理和事件提交
|
|
10
|
+
{!--< /tips >!--}
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
from typing import List, Dict, Any, Optional
|
|
15
|
+
from .adapter_loader import AdapterLoader
|
|
16
|
+
from .module_loader import ModuleLoader
|
|
17
|
+
from ..Core.logger import logger
|
|
18
|
+
from ..Core.lifecycle import lifecycle
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Initializer:
|
|
22
|
+
"""
|
|
23
|
+
初始化协调器
|
|
24
|
+
|
|
25
|
+
协调适配器和模块的加载流程,提供统一的初始化接口
|
|
26
|
+
|
|
27
|
+
{!--< tips >!--}
|
|
28
|
+
使用方式:
|
|
29
|
+
>>> initializer = Initializer(sdk_instance)
|
|
30
|
+
>>> success = await initializer.init()
|
|
31
|
+
{!--< /tips >!--}
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(self, sdk_instance: Any):
|
|
35
|
+
"""
|
|
36
|
+
初始化协调器
|
|
37
|
+
|
|
38
|
+
:param sdk_instance: SDK 实例
|
|
39
|
+
"""
|
|
40
|
+
self._sdk = sdk_instance
|
|
41
|
+
self._adapter_loader = AdapterLoader()
|
|
42
|
+
self._module_loader = ModuleLoader()
|
|
43
|
+
|
|
44
|
+
async def init(self) -> bool:
|
|
45
|
+
"""
|
|
46
|
+
初始化所有模块和适配器
|
|
47
|
+
|
|
48
|
+
执行步骤:
|
|
49
|
+
1. 从 PyPI 包加载适配器
|
|
50
|
+
2. 从 PyPI 包加载模块
|
|
51
|
+
3. 注册适配器
|
|
52
|
+
4. 注册模块
|
|
53
|
+
5. 初始化模块
|
|
54
|
+
|
|
55
|
+
:return: bool 初始化是否成功
|
|
56
|
+
|
|
57
|
+
:raises ImportError: 当加载失败时抛出
|
|
58
|
+
"""
|
|
59
|
+
logger.info("[Init] SDK 正在初始化...")
|
|
60
|
+
lifecycle.start_timer("core.init")
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
# 1. 并行加载适配器和模块
|
|
64
|
+
adapter_manager = self._sdk.adapter
|
|
65
|
+
module_manager = self._sdk.module
|
|
66
|
+
|
|
67
|
+
(adapter_result, module_result) = await asyncio.gather(
|
|
68
|
+
self._adapter_loader.load(adapter_manager),
|
|
69
|
+
self._module_loader.load(module_manager),
|
|
70
|
+
return_exceptions=True
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# 检查是否有异常
|
|
74
|
+
if isinstance(adapter_result, Exception):
|
|
75
|
+
logger.error(f"[Init] 适配器加载失败: {adapter_result}")
|
|
76
|
+
return False
|
|
77
|
+
|
|
78
|
+
if isinstance(module_result, Exception):
|
|
79
|
+
logger.error(f"[Init] 模块加载失败: {module_result}")
|
|
80
|
+
return False
|
|
81
|
+
|
|
82
|
+
# 解包结果
|
|
83
|
+
adapter_objs, enabled_adapters, disabled_adapters = adapter_result # type: ignore
|
|
84
|
+
module_objs, enabled_modules, disabled_modules = module_result # type: ignore
|
|
85
|
+
|
|
86
|
+
logger.info(f"[Init] 加载了 {len(enabled_adapters)} 个适配器, {len(disabled_adapters)} 个适配器被禁用")
|
|
87
|
+
logger.info(f"[Init] 加载了 {len(enabled_modules)} 个模块, {len(disabled_modules)} 个模块被禁用")
|
|
88
|
+
|
|
89
|
+
# 2. 注册适配器
|
|
90
|
+
logger.debug("[Init] 正在注册适配器...")
|
|
91
|
+
if not await self._adapter_loader.register_to_manager(
|
|
92
|
+
enabled_adapters, adapter_objs, adapter_manager
|
|
93
|
+
):
|
|
94
|
+
return False
|
|
95
|
+
|
|
96
|
+
# 3. 注册模块
|
|
97
|
+
logger.debug("[Init] 正在注册模块...")
|
|
98
|
+
if not await self._module_loader.register_to_manager(
|
|
99
|
+
enabled_modules, module_objs, module_manager
|
|
100
|
+
):
|
|
101
|
+
return False
|
|
102
|
+
|
|
103
|
+
# 4. 初始化模块(创建实例并挂载到 SDK)
|
|
104
|
+
logger.debug("[Init] 正在初始化模块...")
|
|
105
|
+
success = await self._module_loader.initialize_modules(
|
|
106
|
+
enabled_modules, module_objs, module_manager, self._sdk
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
if success:
|
|
110
|
+
logger.info("[Init] SDK初始化成功")
|
|
111
|
+
else:
|
|
112
|
+
logger.error("[Init] SDK初始化失败")
|
|
113
|
+
|
|
114
|
+
load_duration = lifecycle.stop_timer("core.init")
|
|
115
|
+
await lifecycle.submit_event(
|
|
116
|
+
"core.init.complete",
|
|
117
|
+
msg="模块初始化完成" if success else "模块初始化失败",
|
|
118
|
+
data={
|
|
119
|
+
"duration": load_duration,
|
|
120
|
+
"success": success,
|
|
121
|
+
"adapters": {
|
|
122
|
+
"enabled": enabled_adapters,
|
|
123
|
+
"disabled": disabled_adapters
|
|
124
|
+
},
|
|
125
|
+
"modules": {
|
|
126
|
+
"enabled": enabled_modules,
|
|
127
|
+
"disabled": disabled_modules
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
)
|
|
131
|
+
return success
|
|
132
|
+
|
|
133
|
+
except Exception as e:
|
|
134
|
+
load_duration = lifecycle.stop_timer("core.init")
|
|
135
|
+
await lifecycle.submit_event(
|
|
136
|
+
"core.init.complete",
|
|
137
|
+
msg="模块初始化失败",
|
|
138
|
+
data={
|
|
139
|
+
"duration": load_duration,
|
|
140
|
+
"success": False,
|
|
141
|
+
"error": str(e)
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
logger.critical(f"SDK初始化严重错误: {e}")
|
|
145
|
+
return False
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
__all__ = [
|
|
149
|
+
"Initializer"
|
|
150
|
+
]
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for initializer.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
ErisPulse 初始化协调器
|
|
9
|
+
|
|
10
|
+
负责协调适配器和模块的加载流程
|
|
11
|
+
|
|
12
|
+
{!--< tips >!--}
|
|
13
|
+
1. 初始化顺序:适配器 → 模块
|
|
14
|
+
2. 支持并行加载优化
|
|
15
|
+
3. 统一的错误处理和事件提交
|
|
16
|
+
{!--< /tips >!--}
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import asyncio
|
|
20
|
+
from typing import List, Dict, Any, Optional
|
|
21
|
+
from .adapter_loader import AdapterLoader
|
|
22
|
+
from .module_loader import ModuleLoader
|
|
23
|
+
from ..Core.logger import logger
|
|
24
|
+
from ..Core.lifecycle import lifecycle
|
|
25
|
+
|
|
26
|
+
class Initializer:
|
|
27
|
+
"""
|
|
28
|
+
初始化协调器
|
|
29
|
+
|
|
30
|
+
协调适配器和模块的加载流程,提供统一的初始化接口
|
|
31
|
+
|
|
32
|
+
{!--< tips >!--}
|
|
33
|
+
使用方式:
|
|
34
|
+
>>> initializer = Initializer(sdk_instance)
|
|
35
|
+
>>> success = await initializer.init()
|
|
36
|
+
{!--< /tips >!--}
|
|
37
|
+
"""
|
|
38
|
+
def __init__(self: None, sdk_instance: Any) -> ...:
|
|
39
|
+
"""
|
|
40
|
+
初始化协调器
|
|
41
|
+
|
|
42
|
+
:param sdk_instance: SDK 实例
|
|
43
|
+
"""
|
|
44
|
+
...
|
|
45
|
+
async def init(self: object) -> bool:
|
|
46
|
+
"""
|
|
47
|
+
初始化所有模块和适配器
|
|
48
|
+
|
|
49
|
+
执行步骤:
|
|
50
|
+
1. 从 PyPI 包加载适配器
|
|
51
|
+
2. 从 PyPI 包加载模块
|
|
52
|
+
3. 注册适配器
|
|
53
|
+
4. 注册模块
|
|
54
|
+
5. 初始化模块
|
|
55
|
+
|
|
56
|
+
:return: bool 初始化是否成功
|
|
57
|
+
|
|
58
|
+
:raises ImportError: 当加载失败时抛出
|
|
59
|
+
"""
|
|
60
|
+
...
|