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