#!/usr/bin/env python3 """Exécute tous les scripts de figures (analysis/python/figures/chNN_*.py) et les scripts R (analysis/r/chNN_*.R). Chaque script est idempotent et écrit dans assets/figures/chNN/. Arrêt sur première erreur si --strict.""" import subprocess, sys, pathlib, time ROOT = pathlib.Path(__file__).resolve().parents[3] strict = "--strict" in sys.argv only = [a for a in sys.argv[1:] if not a.startswith("--")] scripts = sorted((ROOT / "analysis/python/figures").glob("ch*_*.py")) + sorted((ROOT / "analysis/r").glob("ch*_*.R")) if only: scripts = [s for s in scripts if any(s.name.startswith(o) for o in only)] fails = [] env = dict(__import__("os").environ, PYTHONPATH=str(ROOT / "analysis/python")) for s in scripts: t = time.time() cmd = ["python3", str(s)] if s.suffix == ".py" else ["Rscript", str(s)] r = subprocess.run(cmd, cwd=ROOT, capture_output=True, text=True, env=env) status = "OK " if r.returncode == 0 else "ERR" print(f"{status} {s.relative_to(ROOT)} ({time.time()-t:.1f}s)") if r.returncode != 0: fails.append(s.name); print(r.stderr[-1500:]) if strict: sys.exit(1) print(f"\n{len(scripts)-len(fails)}/{len(scripts)} scripts réussis" + (f" ; échecs : {fails}" if fails else "")) sys.exit(1 if fails else 0)