示例驱动: 手工跑也能用 (常量从自带的 配置.efi.json 回落) + 契约清单来源说清三态
This commit is contained in:
+26
-2
@@ -30,6 +30,7 @@ import urllib.error
|
|||||||
import urllib.parse
|
import urllib.parse
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from functools import lru_cache
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, cast
|
from typing import Any, cast
|
||||||
|
|
||||||
@@ -49,11 +50,29 @@ from typing import Any, cast
|
|||||||
# ---------------------------------------------------------------- 与底座打交道
|
# ---------------------------------------------------------------- 与底座打交道
|
||||||
|
|
||||||
def 取环境(键: str, 默认: str = "") -> str:
|
def 取环境(键: str, 默认: str = "") -> str:
|
||||||
"""取一个配置值: 内核把 配置.efi.json 的 env 段注入环境变量, 手工跑就是普通环境变量."""
|
"""取一个配置值.
|
||||||
|
|
||||||
|
顺序: 环境变量优先 (内核把 `配置.efi.json` 的 env 段注入环境; 手工跑就是普通环境变量),
|
||||||
|
没有再回落到**驱动自己的** `配置.efi.json` 的 env 段 -- 这样 `python3 驱动/技能执行/执行.py`
|
||||||
|
不经过内核也能直接跑 (调试手法: 驱动都是普通程序, 见 文档/02 第 7 节).
|
||||||
|
"""
|
||||||
值 = os.environ.get(键, "").strip()
|
值 = os.environ.get(键, "").strip()
|
||||||
|
if not 值:
|
||||||
|
值 = str(自带配置().get(键) or "").strip()
|
||||||
return 值 if 值 else 默认
|
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:
|
def 汇报(消息: str, kind: str = "log", 数据: dict[str, Any] | None = None) -> None:
|
||||||
"""往 events 表插一行 -- 驱动唯一的汇报方式 (没有协议, 内核只读表, 不解析 stdout).
|
"""往 events 表插一行 -- 驱动唯一的汇报方式 (没有协议, 内核只读表, 不解析 stdout).
|
||||||
|
|
||||||
@@ -507,7 +526,12 @@ def 主() -> int:
|
|||||||
return 1
|
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)
|
print(f"{驱动名}: 契约清单 {len(清单)} 条 (来源 {来源}): {[项['want'] for 项 in 清单]}", flush=True)
|
||||||
|
|
||||||
系统提示 = 拼系统提示(技能)
|
系统提示 = 拼系统提示(技能)
|
||||||
|
|||||||
Reference in New Issue
Block a user