diff --git a/Html/apps/function_tools/judge.py b/Html/apps/function_tools/judge.py index 325a409..bae74ab 100644 --- a/Html/apps/function_tools/judge.py +++ b/Html/apps/function_tools/judge.py @@ -19,43 +19,43 @@ def judge(filepath:str, name: str, course_id: str, lesson_name: str, root_path:s directory = 'books/code_tests/'+course_id+'/'+name # 如果目录不存在,报错 if not os.path.exists(directory): - status = FunctionStatus.FAILED - return FunctionResponse("judge", status, f"The name {name} is not found.") - files = os.listdir(directory) - in_files = [file for file in files if file.endswith('.in')] - save_dir = root_path - Report = "" - passed_num=0 - failed_num=0 - erroroutput = "" - exceptoutput="" - for file in in_files: - file_path = os.path.join(save_dir, f"_{name}.out") - if os.path.exists(file_path): - os.remove(file_path) - with open(file_path, 'w') as ff: - ff.write("") - - cmd = "cat " + os.path.join(directory, file) + " | " + "python " + os.path.join(root_path, filepath) +" > " + os.path.join(save_dir, f"_{name}.out") - os.system(cmd) - # 比较结果 - re = "" - if compare_file(os.path.join(save_dir, f"_{name}.out"), os.path.join(directory, file.replace(".in", ".out"))): - re = f"Passed {file}" - passed_num += 1 - else: - re = f"Failed {file}" - failed_num += 1 - with open(os.path.join(directory, file.replace(".in", ".out")),'r') as f: exceptoutput = f.read() - with open(os.path.join(save_dir, f"_{name}.out"),'r') as f: erroroutput = f.read() - Report = Report + re + "\n" - os.remove(os.path.join(save_dir, f"_{name}.out")) - score = int (100 * passed_num / (passed_num + failed_num)) - + return FunctionResponse("judge", False, f"The name {name} is not found.") + try: + files = os.listdir(directory) + in_files = [file for file in files if file.endswith('.in')] + save_dir = root_path + Report = "" + passed_num=0 + failed_num=0 + erroroutput = "" + exceptoutput="" + for file in in_files: + file_path = os.path.join(save_dir, f"_{name}.out") + if os.path.exists(file_path): + os.remove(file_path) + with open(file_path, 'w') as ff: + ff.write("") + + cmd = "cat " + os.path.join(directory, file) + " | " + "python " + os.path.join(root_path, filepath) +" > " + os.path.join(save_dir, f"_{name}.out") + os.system(cmd) + # 比较结果 + re = "" + if compare_file(os.path.join(save_dir, f"_{name}.out"), os.path.join(directory, file.replace(".in", ".out"))): + re = f"Passed {file}" + passed_num += 1 + else: + re = f"Failed {file}" + failed_num += 1 + with open(os.path.join(directory, file.replace(".in", ".out")),'r') as f: exceptoutput = f.read() + with open(os.path.join(save_dir, f"_{name}.out"),'r') as f: erroroutput = f.read() + Report = Report + re + "\n" + os.remove(os.path.join(save_dir, f"_{name}.out")) + score = int (100 * passed_num / (passed_num + failed_num)) + return FunctionResponse("judge", True, f"评测得分为 {score}, 在 {passed_num + failed_num} 个测试用例中通过了 {passed_num}个。最后一个错误样例期望输出:'{exceptoutput}',但你的输出:'{erroroutput}") + except Exception as e: + return FunctionResponse("judge", False, f"评测发生意外错误: {str(e)}") - status = FunctionStatus.SUCCESS - return FunctionResponse("judge", status, f"评测得分为 {score}, 在 {passed_num + failed_num} 个测试用例中通过了 {passed_num}个。最后一个错误样例期望输出:'{exceptoutput}',但你的输出:'{erroroutput}") def compare_file(path1:str, path2:str): diff --git a/Html/apps/models/function.py b/Html/apps/models/function.py index 3c577b5..1df10c3 100644 --- a/Html/apps/models/function.py +++ b/Html/apps/models/function.py @@ -2,16 +2,17 @@ from pydantic import BaseModel from enum import Enum from typing import Optional -FunctionStatus = Enum("FunctionStatus", ["SUCCESS", "FAILED"]) + + class FunctionResponse(BaseModel): name: str - status: FunctionStatus + success: bool message: str = "" args: Optional[dict] = None - def __init__(self, name: str, status: FunctionStatus, message: str = "", args: Optional[dict] = None): - super().__init__(name=name, status=status, message=message, args=args) + def __init__(self, name: str, success: bool, message: str = "", args: Optional[dict] = None): + super().__init__(name=name, success=success, message=message, args=args) def to_dict(self): return self.model_dump()