93 lines
3.0 KiB
Python
93 lines
3.0 KiB
Python
"""编译完跑一遍:把 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())
|