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