researcher-env / tools /code_executor.py
Avni Mittal
Initial commit: ResearcherEnv - OpenEnv research agent environment
fb131f6
"""Sandboxed Python code execution via subprocess."""
from __future__ import annotations
import os
import subprocess
from typing import Any
def execute(code: str, output_dir: str, timeout: int = 30) -> dict[str, Any]:
"""Run *code* in a subprocess and return results.
The code receives ``OUTPUT_DIR`` as a pre-set variable pointing to
*output_dir* so it can save files (plots, data, etc.).
Returns ``{"stdout", "stderr", "exit_code", "files"}``.
"""
os.makedirs(output_dir, exist_ok=True)
preamble = (
"import os\n"
f"OUTPUT_DIR = {output_dir!r}\n"
"os.makedirs(OUTPUT_DIR, exist_ok=True)\n"
)
full_code = preamble + code
env = {**os.environ, "MPLBACKEND": "Agg"}
try:
result = subprocess.run(
["python", "-c", full_code],
capture_output=True,
text=True,
timeout=timeout,
env=env,
)
exit_code = result.returncode
stdout = result.stdout[:3000]
stderr = result.stderr[:500]
except subprocess.TimeoutExpired:
exit_code = -1
stdout = ""
stderr = f"Code execution timed out after {timeout}s"
files = sorted(os.listdir(output_dir)) if os.path.isdir(output_dir) else []
return {
"stdout": stdout,
"stderr": stderr,
"exit_code": exit_code,
"files": files,
}