示例驱动: 手工跑也能用 (常量从自带的 配置.efi.json 回落) + 契约清单来源说清三态
This commit is contained in:
+26
-2
@@ -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)
|
||||
|
||||
系统提示 = 拼系统提示(技能)
|
||||
|
||||
Reference in New Issue
Block a user