MultiPLE-Evaluator / src /libeval.py
dongsheng's picture
Upload 48 files
41e79e2 verified
import os
import signal
import subprocess
from typing import List
from . import generic_eval
def testing_mail(x, y, z):
generic_eval.gmain(x, y, z)
def run_without_exn(args: List[str]):
"""
Runs the given program with a five second timeout. Does not throw an exception
no matter what happens. The output is a dictionary of the format that we expect
for our evaluation scripts. The "status" field is "OK" when the exit code is
zero. If that isn't enough, you may want to tweak the status based on the
captured stderr and stdout.
"""
p = subprocess.Popen(
args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, start_new_session=True
)
try:
stdout, stderr = p.communicate(timeout=5)
exit_code = p.returncode
status = "OK" if exit_code == 0 else "Exception"
except subprocess.TimeoutExpired as exc:
stdout, stderr = p.stdout.read(), p.stderr.read()
os.killpg(os.getpgid(p.pid), signal.SIGTERM)
exit_code = -1
status = "Timeout"
if stdout is None:
stdout = b""
if stderr is None:
stderr = b""
return {
"status": status,
"exit_code": exit_code,
"stdout": stdout.decode("utf-8", errors="ignore"),
"stderr": stderr.decode("utf-8", errors="ignore"),
}