diff --git a/驱动/技能执行/执行.py b/驱动/技能执行/执行.py index 541f682..76f6ef8 100644 --- a/驱动/技能执行/执行.py +++ b/驱动/技能执行/执行.py @@ -30,6 +30,7 @@ import urllib.error import urllib.parse import urllib.request from datetime import datetime +from functools import lru_cache from pathlib import Path from typing import Any, cast @@ -49,11 +50,29 @@ from typing import Any, cast # ---------------------------------------------------------------- 与底座打交道 def 取环境(键: str, 默认: str = "") -> str: - """取一个配置值: 内核把 配置.efi.json 的 env 段注入环境变量, 手工跑就是普通环境变量.""" + """取一个配置值. + + 顺序: 环境变量优先 (内核把 `配置.efi.json` 的 env 段注入环境; 手工跑就是普通环境变量), + 没有再回落到**驱动自己的** `配置.efi.json` 的 env 段 -- 这样 `python3 驱动/技能执行/执行.py` + 不经过内核也能直接跑 (调试手法: 驱动都是普通程序, 见 文档/02 第 7 节). + """ 值 = os.environ.get(键, "").strip() + if not 值: + 值 = str(自带配置().get(键) or "").strip() return 值 if 值 else 默认 +@lru_cache(maxsize=1) +def 自带配置() -> dict[str, str]: + """读驱动自己那份 配置.efi.json 的 env 段 (读不了就当空, 不炸).""" + try: + 内容: Any = json.loads((驱动目录 / "配置.efi.json").read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError): + return {} + 段 = 取对象(取对象(内容).get("env")) + return {str(键): str(值) for 键, 值 in 段.items()} + + def 汇报(消息: str, kind: str = "log", 数据: dict[str, Any] | None = None) -> None: """往 events 表插一行 -- 驱动唯一的汇报方式 (没有协议, 内核只读表, 不解析 stdout). @@ -507,7 +526,12 @@ def 主() -> int: return 1 清单 = 读契约清单() - 来源 = "环境变量" if 取环境("EFI_SKILL_CONTRACTS") else "PG 的 drivers 表" + if 取环境("EFI_SKILL_CONTRACTS"): + 来源 = "环境变量" + elif os.environ.get("EFI_DB"): + 来源 = "PG 的 drivers 表" + else: + 来源 = "没有 (手工跑, 既没 EFI_DB 也没显式给, 不算错)" print(f"{驱动名}: 契约清单 {len(清单)} 条 (来源 {来源}): {[项['want'] for 项 in 清单]}", flush=True) 系统提示 = 拼系统提示(技能)