修改部分常量定义

增加编译功能
This commit is contained in:
virusdefender
2015-07-07 13:33:38 +08:00
parent cc0f720de9
commit ef88a8a155
5 changed files with 84 additions and 37 deletions

View File

@@ -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 <stdio.h>
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,

View File

@@ -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

View File

@@ -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

26
judge/language.py Normal file
View File

@@ -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}"
}
}

12
judge/result.py Normal file
View File

@@ -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}