From ef88a8a15509d0b6b12e2b3c0bcfb8d378377b17 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 7 Jul 2015 13:33:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加编译功能 --- judge/client.py | 53 +++++++++++++++++++++++++++++------------------ judge/compiler.py | 13 ++++++++++++ judge/consts.py | 17 --------------- judge/language.py | 26 +++++++++++++++++++++++ judge/result.py | 12 +++++++++++ 5 files changed, 84 insertions(+), 37 deletions(-) delete mode 100644 judge/consts.py create mode 100644 judge/language.py create mode 100644 judge/result.py diff --git a/judge/client.py b/judge/client.py index aa9373b..37efa66 100644 --- a/judge/client.py +++ b/judge/client.py @@ -5,8 +5,9 @@ import hashlib from multiprocessing import Pool from settings import max_running_number, lrun_gid, lrun_uid, judger_workspace -from consts import Language, Result - +from language import languages +from result import result +from compiler import compile_ class JudgeClientException(Exception): pass @@ -19,19 +20,19 @@ def _run(instance, test_case_id): class JudgeClient(object): - def __init__(self, language, exec_file_path, max_cpu_time, + def __init__(self, language_code, exe_path, max_cpu_time, max_real_time, max_memory, test_case_dir): """ - :param language: 语言,见consts.py - :param exec_file_path: 可执行文件路径 + :param language_code: 语言编号 + :param exe_path: 可执行文件路径 :param max_cpu_time: 最大cpu时间,单位ms :param max_real_time: 最大执行时间,单位ms :param max_memory: 最大内存,单位MB :param test_case_dir: 测试用例文件夹路径 :return:返回结果list """ - self._language = language - self._exec_file_path = exec_file_path + self._language = languages[str(language_code)] + self._exe_path = exe_path self._max_cpu_time = max_cpu_time self._max_real_time = max_real_time self._max_memory = max_memory @@ -79,12 +80,11 @@ class JudgeClient(object): " --uid " + str(lrun_uid) + \ " --gid " + str(lrun_gid) - if self._language == Language.JAVA: - command += (" java " + self._exec_file_path) - else: - command += (" " + self._exec_file_path) + execute_command = self._language["execute_command"].format(exe_path=self._exe_path) - command += (" 0<" + self._test_case_dir + str(test_case_id) + ".in" + + command += (" " + + execute_command + + " 0<" + self._test_case_dir + str(test_case_id) + ".in" + " 1>" + judger_workspace + str(test_case_id) + ".out" + " 3>&2") return command @@ -160,15 +160,15 @@ class JudgeClient(object): # 如果返回值非0 或者信号量不是0 代表非正常结束 if run_result["exit_code"] or run_result["term_sig"] or run_result["siginaled"]: - run_result["result"] = Result.RUNTIME_ERROR + run_result["result"] = result["runtime_error"] return run_result # 代表内存或者时间超过限制了 if run_result["exceed"]: if run_result["exceed"] == "memory": - run_result["result"] = Result.MEMORY_LIMIT_EXCEEDED + run_result["result"] = result["memory_limit_exceeded"] elif run_result["exceed"] in ["cpu_time", "real_time"]: - run_result["result"] = Result.TIME_LIMIT_EXCEEDED + run_result["result"] = result["time_limit_exceeded"] else: raise JudgeClientException("Error exceeded type: " + run_result["exceed"]) return run_result @@ -176,9 +176,9 @@ class JudgeClient(object): # 下面就是代码正常运行了 需要判断代码的输出是否正确 if self._compare_output(test_case_id): - run_result["result"] = Result.ACCEPTED + run_result["result"] = result["accepted"] else: - run_result["result"] = Result.WRONG_ANSWER + run_result["result"] = result["wrong_answer"] return run_result @@ -197,7 +197,7 @@ class JudgeClient(object): results.append(item.get()) except Exception as e: print e - results.append({"result": Result.SYSTEM_ERROR}) + results.append({"result": result["system_error"]}) return results def __getstate__(self): @@ -208,8 +208,21 @@ class JudgeClient(object): return self_dict -client = JudgeClient(language=Language.C, - exec_file_path="/var/judger/a.out", + +src = """ +#include +int main() +{ + printf("Hello world"); + return 0; +} +""" +f = open("/var/judger/main.c", "w") +f.write(src) +f.close() + +client = JudgeClient(language_code=1, + exe_path=compile_(languages["1"], "/var/judger/main.c", "/var/judger/main"), max_cpu_time=1000000, max_real_time=200000, max_memory=1, diff --git a/judge/compiler.py b/judge/compiler.py index 9bad579..27f97f9 100644 --- a/judge/compiler.py +++ b/judge/compiler.py @@ -1 +1,14 @@ # coding=utf-8 +import commands + + +class CompileError(Exception): + pass + + +def compile_(language_item, src_path, exe_path): + command = language_item["compile_command"].format(src_path=src_path, exe_path=exe_path) + status, output = commands.getstatusoutput(command) + if status: + raise CompileError(output) + return exe_path diff --git a/judge/consts.py b/judge/consts.py deleted file mode 100644 index a1edcbb..0000000 --- a/judge/consts.py +++ /dev/null @@ -1,17 +0,0 @@ -# coding=utf-8 -class Result(object): - ACCEPTED = 0 - RUNTIME_ERROR = 1 - TIME_LIMIT_EXCEEDED = 2 - MEMORY_LIMIT_EXCEEDED = 3 - COMPILE_ERROR = 4 - FORMAT_ERROR = 5 - WRONG_ANSWER = 6 - SYSTEM_ERROR = 7 - WAITING = 8 - - -class Language(object): - C = 1 - CPP = 2 - JAVA = 3 diff --git a/judge/language.py b/judge/language.py new file mode 100644 index 0000000..b596ee3 --- /dev/null +++ b/judge/language.py @@ -0,0 +1,26 @@ +# coding=utf-8 + + + +languages = { + "1": { + "name": "c", + "code": 1, + "compile_command": "gcc -DONLINE_JUDGE -O2 -Wall -std=c99 -pipe {src_path} -lm -o {exe_path}", + "execute_command": "{exe_path}" + }, + "2": { + "name": "cpp", + "code": 2, + "compile_command": "g++ -DONLINE_JUDGE -O2 -Wall -std=c++11 -pipe {src_path} -lm -o {exe_path}", + "execute_command": "{exe_path}" + }, + "3": { + "name": "java", + "code": 3, + "compile_command": "javac {src_path} -d {exe_path}", + "execute_command": "java {exe_path}" + } +} + + diff --git a/judge/result.py b/judge/result.py new file mode 100644 index 0000000..9b7cc4d --- /dev/null +++ b/judge/result.py @@ -0,0 +1,12 @@ +# coding=utf-8 + + +result = {"accepted": 0, + "runtime_error": 1, + "time_limit_exceeded": 2, + "memory_limit_exceeded": 3, + "compile_error": 4, + "format_error": 5, + "wrong_answer": 6, + "system_error": 7, + "waiting": 8} \ No newline at end of file