#!/usr/bin/env python3 # -*- coding: utf-8 -*- """mem_check.py - 跑项目的 RAM/栈报告(薄运行器,纯标准库)。 依次调用仓库的 ram_report.py 与 stack_report.py(路径可覆盖),打印各自退出码 与总结。用法(项目根目录): python /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())