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"), }