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