chronaxis.can_dependencies
源码基线:8904c2f744951857659abd40aaa3535d57faf53c
1"""在真正使用 CAN 库时给出缺依赖诊断,已安装的库仍按需导入。23输入为固定支持的模块名,输出为原模块;仅包装缺少模块的异常,其他导入错误4继续原样报告。不安装依赖、不读取输入、不修改 reader/decoder 的调用顺序。5"""6from importlib import import_module789CAN_INSTALL_HINT = (10 '请在运行分析的同一个 Python 环境重新安装本地 wheel,默认会安装 CAN 依赖:'11 'python -m pip install "./chronaxis-<版本>-py3-none-any.whl"。'12 '将文件路径替换为实际收到的安装包;离线时需备齐该 wheel 声明版本的依赖。'13 '不要通过修改信号字段解决环境缺依赖,也不要仅安装未核实版本的 cantools。'14)151617class CANDependencyError(ImportError):18 """保留缺失模块名与机器码的 CAN 环境错误,不冒充配置值错误。"""1920 code = 'dependency_missing'2122 def __init__(self, module_name):23 """保存缺项及安装建议。参数: module_name 为缺失模块名。返回: None。异常: 无。"""24 self.module_name = module_name25 self.hint = CAN_INSTALL_HINT26 super().__init__(f'缺少 CAN 读取/解码依赖:{module_name}。{self.hint}')272829def import_can_dependency(module_name):30 """按既有调用点导入实际需要的 CAN 库。3132 参数: module_name 为 can、cantools 或 natsort。33 返回: 原 Python 模块。异常: CANDependencyError 表示模块或其依赖缺失;34 其他 ImportError 原样传播,避免将损坏或不兼容安装误报成信号错误。35 """36 if module_name not in ('can', 'cantools', 'natsort'):37 raise ValueError('不是已声明的 CAN 依赖')38 try:39 return import_module(module_name)40 except ModuleNotFoundError as error:41 # 间接依赖也可能缺失;保留具体名字供定位完整安装问题。42 raise CANDependencyError(error.name or module_name) from error434445def runtime_dependency_versions():46 """取得当前解释器与CAN依赖的实际版本,用于父子环境一致性核对。4748 参数: 无。返回: python、python-can、cantools、natsort版本字符串字典。49 异常: 缺少分发元数据时PackageNotFoundError;不导入CAN库或打开业务输入。50 支持版本范围由安装元数据和兼容矩阵定义,不用历史固定补丁号拒绝已验证版本。51 """52 from importlib import metadata53 import platform54 # 元数据只核对实际父子环境,不在模块导入时载入第三方CAN库。55 return {56 'python': platform.python_version(),57 **{name: metadata.version(name) for name in ('python-can', 'cantools', 'natsort')},58 }59