feat: 增加伴生包加载器、manifest配置,Excel处理优化

This commit is contained in:
2026-07-21 16:26:16 +08:00
parent 45e4f1ecf2
commit 91bb61444e
19 changed files with 1364 additions and 82 deletions
+93
View File
@@ -0,0 +1,93 @@
"""编译完跑一遍:把 build/ 下的伴生包 .pyd 挂到 sys.modules
再用真实接口(openpyxl.load_workbook)写读一个最小 Excel,确认链路可用。
用法:
python tools/verify_companions.py
注意:本脚本直接 import mil.core.companion_loader**不**经过 mil/__init__.py
避免在无 PySide6 的开发机上因 UI 桥接而炸(生产宿主环境必然有 PySide6)。
"""
from __future__ import annotations
import argparse
import importlib.util
import sys
import tempfile
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT))
# 不走 mil/__init__.py,单独加载 companion_loader
spec = importlib.util.spec_from_file_location(
"mil_companion_loader", ROOT / "mil" / "core" / "companion_loader.py"
)
companion_loader = importlib.util.module_from_spec(spec)
spec.loader.exec_module(companion_loader)
load_companions = companion_loader.load_companions
# 伴生包清单:与 mil/__init__.py 中的 COMPANION_PACKAGES 保持一致
COMPANION_PACKAGES: list[str] = [
"openpyxl",
"et_xmlfile",
]
def main() -> int:
parser = argparse.ArgumentParser(description="验证伴生包 .pyd 加载链路")
parser.add_argument(
"--fallback",
action="store_true",
help="未发现产物时回退到 site-packages 已装版本(开发自测用)",
)
args = parser.parse_args()
loaded = load_companions(COMPANION_PACKAGES)
print(f"[verify] 加载器返回: {loaded}")
if not loaded and not args.fallback:
print(
"[verify] FAIL: 没有挂载到任何伴生包(是否忘了 python build_pyd.py?)\n"
" 调试期可加 --fallback 走 site-packages 自测加载器逻辑。",
file=sys.stderr,
)
return 1
if not loaded and args.fallback:
# 开发自测:build/mil_runtime 都没有时,从 sys.path 兜底
import importlib
for pkg in COMPANION_PACKAGES:
importlib.import_module(pkg)
loaded.append(pkg)
print(f"[verify] fallback 后挂载: {loaded}")
# 用 openpyxl 真接口验证:写一个最小 xlsx,立刻读回来
import openpyxl # noqa: WPS433 延迟导入以验证挂载生效
print(f"[verify] openpyxl 来自: {openpyxl.__file__}")
with tempfile.TemporaryDirectory() as td:
xlsx_path = Path(td) / "smoke.xlsx"
wb = openpyxl.Workbook()
ws = wb.active
ws["A1"] = "time"
ws["B1"] = "sig1"
ws["A2"] = 0.0
ws["B2"] = 1
ws["A3"] = 1.0
ws["B3"] = 2
wb.save(xlsx_path)
wb2 = openpyxl.load_workbook(xlsx_path)
ws2 = wb2.active
assert ws2["A1"].value == "time", ws2["A1"].value
assert ws2["B1"].value == "sig1", ws2["B1"].value
assert float(ws2["A3"].value) == 1.0, ws2["A3"].value
assert int(ws2["B3"].value) == 2, ws2["B3"].value
print("[verify] PASS: openpyxl 写读闭环 ✓")
return 0
if __name__ == "__main__":
sys.exit(main())