docker_test / src /libeval.py
朱东升
requirements update20
5491a9c
raw
history blame
1.32 kB
import os
import signal
import subprocess
from typing import List
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"),
}