Spaces:
Runtime error
Runtime error
""" | |
Source and credits: https://github.com/ZubinGou/math-evaluation-harness/blob/main/python_executor.py | |
We modified it to be more simple. | |
""" | |
import io | |
import pickle | |
import traceback | |
from concurrent.futures import ProcessPoolExecutor, TimeoutError | |
from contextlib import redirect_stdout | |
class GenericRuntime: | |
GLOBAL_DICT = {} | |
LOCAL_DICT = None | |
HEADERS = [] | |
def __init__(self): | |
self._global_vars = self.GLOBAL_DICT.copy() | |
self._local_vars = self.LOCAL_DICT.copy() if self.LOCAL_DICT else None | |
for c in self.HEADERS: | |
self.exec_code(c) | |
def exec_code(self, code_piece: str) -> None: | |
exec(code_piece, self._global_vars) | |
def eval_code(self, expr: str) -> any: | |
return eval(expr, self._global_vars) | |
def inject(self, var_dict): | |
self._global_vars.update(var_dict) | |
def answer(self): | |
return self._global_vars['answer'] | |
class PythonExecutor: | |
def __init__( | |
self, | |
runtime=None, | |
get_answer_symbol=None, | |
get_answer_expr=None, | |
get_answer_from_stdout=False, | |
timeout_length=5, | |
): | |
self.runtime = runtime if runtime else GenericRuntime() | |
self.answer_symbol = get_answer_symbol | |
self.get_answer_expr = get_answer_expr | |
self.get_answer_from_stdout = get_answer_from_stdout | |
self.timeout_length = timeout_length | |
def execute(self, code): | |
try: | |
if self.get_answer_from_stdout: | |
program_io = io.StringIO() | |
with redirect_stdout(program_io): | |
self.runtime.exec_code('\n'.join(code)) | |
program_io.seek(0) | |
result = program_io.read() | |
elif self.answer_symbol: | |
self.runtime.exec_code('\n'.join(code)) | |
result = self.runtime._global_vars[self.answer_symbol] | |
elif self.get_answer_expr: | |
self.runtime.exec_code('\n'.join(code)) | |
result = self.runtime.eval_code(self.get_answer_expr) | |
else: | |
self.runtime.exec_code('\n'.join(code[:-1])) | |
result = self.runtime.eval_code(code[-1]) | |
report = "Done" | |
pickle.dumps(result) # Serialization check | |
except Exception as e: | |
result = '' | |
report = str(e) | |
return result, report | |
def apply(self, code): | |
code_snippet = code.split('\n') | |
# Use ProcessPoolExecutor to enforce timeout | |
with ProcessPoolExecutor() as executor: | |
future = executor.submit(self.execute, code_snippet) | |
try: | |
result, report = future.result(timeout=self.timeout_length) | |
except TimeoutError: | |
result, report = "", "Timeout Error" | |
return result.strip(), report.strip() | |
# Example usage | |
if __name__ == "__main__": | |
executor = PythonExecutor(get_answer_from_stdout=True) | |
code = """ | |
from sympy import Matrix | |
def null_space_basis(): | |
A = Matrix([[3, 3, -1, -6], [9, -1, -8, -1], [7, 4, -2, -9]]) | |
basis = A.nullspace() | |
return [v.evalf(3) for v in basis] | |
result = null_space_basis() | |
print(result) | |
""" | |
result, report = executor.apply(code) | |
print("Result:", result) | |
print("Report:", report) |