| from __future__ import annotations |
|
|
| import os |
| import shutil |
| import subprocess |
| import sys |
| from pathlib import Path |
| from uuid import uuid4 |
|
|
|
|
| TIMEOUT_SECONDS = 2 |
|
|
|
|
| def run_code(code: str, input_data: str) -> dict: |
| temp_parent = Path(os.getenv("ADAPT_TMP_DIR", ".adapt_tmp")).resolve() |
| temp_parent.mkdir(parents=True, exist_ok=True) |
| tmpdir = temp_parent / f"run_{uuid4().hex}" |
| tmpdir.mkdir() |
|
|
| try: |
| file_path = Path(tmpdir) / "submission.py" |
| file_path.write_text(code, encoding="utf-8") |
|
|
| try: |
| result = subprocess.run( |
| ["python3", str(file_path)], |
| input=input_data, |
| text=True, |
| capture_output=True, |
| timeout=TIMEOUT_SECONDS, |
| ) |
| except subprocess.TimeoutExpired as exc: |
| return { |
| "stdout": exc.stdout or "", |
| "stderr": "Execution timed out", |
| "exit_code": -1, |
| "timed_out": True, |
| } |
|
|
| return { |
| "stdout": result.stdout, |
| "stderr": result.stderr, |
| "exit_code": result.returncode, |
| "timed_out": False, |
| } |
| finally: |
| shutil.rmtree(tmpdir, ignore_errors=True) |
|
|