示例驱动: 手工跑也能用 (常量从自带的 配置.efi.json 回落) + 契约清单来源说清三态

This commit is contained in:
lou
2026-09-17 12:42:43 +08:00
parent 2155f65c76
commit 1a00b5e23c
+26 -2
View File
@@ -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)
系统提示 = 拼系统提示(技能)