65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""mem_check.py - 跑项目的 RAM/栈报告(薄运行器,纯标准库)。
|
|
|
|
依次调用仓库的 ram_report.py 与 stack_report.py(路径可覆盖),打印各自退出码
|
|
与总结。用法(项目根目录):
|
|
python <skill>/scripts/mem_check.py [--ram-script scripts/ram_report.py]
|
|
[--stack-script scripts/stack_report.py] [--serial-log PATH] [--python PATH]
|
|
退出码: 0=两报告都过 / 1=任一 FAIL / 2=脚本缺失或用法错误。
|
|
"""
|
|
|
|
import argparse
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
|
|
def find_python(cli):
|
|
if cli:
|
|
return cli
|
|
for cand in (".venv/Scripts/python.exe", ".venv/bin/python"):
|
|
if Path(cand).is_file():
|
|
return cand
|
|
return sys.executable
|
|
|
|
|
|
def run(py, script, extra):
|
|
p = Path(script)
|
|
if not p.is_file():
|
|
print("MISSING: {}".format(p))
|
|
return 2
|
|
print("=== {} ===".format(p))
|
|
r = subprocess.run([py, str(p)] + extra)
|
|
return r.returncode
|
|
|
|
|
|
def main(argv=None):
|
|
for s in (sys.stdout, sys.stderr):
|
|
try:
|
|
s.reconfigure(encoding="utf-8", errors="replace")
|
|
except Exception:
|
|
pass
|
|
ap = argparse.ArgumentParser(description="run RAM/stack reports")
|
|
ap.add_argument("--ram-script", default="scripts/ram_report.py")
|
|
ap.add_argument("--stack-script", default="scripts/stack_report.py")
|
|
ap.add_argument("--serial-log", default=None,
|
|
help="serial log with [STACK] lines (overlay runtime watermarks)")
|
|
ap.add_argument("--python", default=None, help="interpreter (default .venv)")
|
|
args = ap.parse_args(argv)
|
|
|
|
py = find_python(args.python)
|
|
rc_ram = run(py, args.ram_script, [])
|
|
stack_extra = ["-s", args.serial_log] if args.serial_log else []
|
|
rc_stack = run(py, args.stack_script, stack_extra)
|
|
|
|
worst = max(rc_ram, rc_stack)
|
|
print("MEM_CHECK: ram={} stack={} -> {}".format(rc_ram, rc_stack,
|
|
"PASS" if worst == 0 else ("FAIL" if worst == 1 else "ERROR")))
|
|
return 0 if worst == 0 else (1 if worst == 1 else 2)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|