import subprocess import sys import tempfile import os import time class CodeExecutor: def execute(self, code: str, test_cases: str = "", timeout: int = 10) -> dict: full_code = code if test_cases.strip(): full_code = code + "\n\n" + test_cases tmp = None try: with tempfile.NamedTemporaryFile( mode="w", suffix=".py", delete=False, encoding="utf-8" ) as f: f.write(full_code) tmp = f.name env = os.environ.copy() env["PYTHONIOENCODING"] = "utf-8" env["PYTHONUTF8"] = "1" t0 = time.time() result = subprocess.run( [sys.executable, "-X", "utf8", tmp], capture_output=True, text=True, encoding="utf-8", errors="replace", timeout=timeout, env=env, ) elapsed = time.time() - t0 return { "success": result.returncode == 0, "stdout": result.stdout, "stderr": result.stderr, "return_code": result.returncode, "elapsed": round(elapsed, 3), "timed_out": False, "full_code": full_code, } except subprocess.TimeoutExpired: return { "success": False, "stdout": "", "stderr": f"TimeoutError: Execution exceeded {timeout} seconds.", "return_code": -1, "elapsed": float(timeout), "timed_out": True, "full_code": full_code, } except Exception as e: return { "success": False, "stdout": "", "stderr": str(e), "return_code": -1, "elapsed": 0.0, "timed_out": False, "full_code": full_code, } finally: if tmp: try: os.unlink(tmp) except OSError: pass