File size: 2,169 Bytes
3962d8b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | 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
|