feat: 增加伴生包加载器、manifest配置,Excel处理优化
This commit is contained in:
@@ -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())
|
||||
Reference in New Issue
Block a user