File size: 4,312 Bytes
30b1610
 
08681f4
30b1610
4f32597
08681f4
30b1610
74d43a2
4f32597
74d43a2
4f32597
 
74d43a2
 
4f32597
08681f4
 
30b1610
141e12d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
08681f4
 
30b1610
08681f4
 
 
 
 
 
 
 
 
 
 
 
22cec65
08681f4
 
 
452bf3c
52d43e7
08681f4
 
52d43e7
08681f4
 
74d43a2
 
08681f4
52d43e7
 
 
141e12d
452bf3c
08681f4
 
52d43e7
 
08681f4
 
 
 
 
 
22cec65
08681f4
 
 
 
 
 
30b1610
08681f4
 
 
 
 
 
74d43a2
30b1610
a2bac48
 
 
 
 
 
 
 
08681f4
a2bac48
30b1610
08681f4
a2bac48
 
30b1610
08681f4
30b1610
4f32597
 
08681f4
 
30b1610
08681f4
 
30b1610
08681f4
 
 
2f2f63e
30b1610
 
08681f4
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import gradio as gr
import json
import importlib
import os
import sys
from pathlib import Path

# 添加当前目录和src目录到模块搜索路径
current_dir = os.path.dirname(os.path.abspath(__file__))
src_dir = os.path.join(current_dir, "src")
if current_dir not in sys.path:
    sys.path.append(current_dir)
if src_dir not in sys.path:
    sys.path.append(src_dir)

def evaluate(input_data):
    """评估代码的主函数
    
    Args:
        input_data: 可以是字符串(文件路径)、字典(包含代码信息)或列表(批量处理多个测试用例)
        
    Returns:
        dict/list: 包含评估结果的字典或列表
    """
    try:
        # 如果输入是列表(批量处理)
        if isinstance(input_data, list):
            results = []
            for item in input_data:
                result = evaluate_single_case(item)
                results.append(result)
            return results
        
        # 单个用例处理
        return evaluate_single_case(input_data)
            
    except Exception as e:
        return {"status": "Exception", "error": str(e)}

def evaluate_single_case(input_data):
    """评估单个代码用例
    
    Args:
        input_data: 可以是字符串(文件路径)或字典(包含代码信息)
        
    Returns:
        dict: 包含评估结果的字典
    """
    try:
        # 如果输入是文件路径
        if isinstance(input_data, str):
            with open(input_data, 'r') as f:
                code = f.read()
            # 从文件扩展名确定语言
            language = Path(input_data).suffix[1:]
            result = evaluate_code(code, language)
            return result
        
        # 如果输入是字典
        elif isinstance(input_data, dict):
            language = input_data.get('language')
            completions = input_data.get('processed_completions', [])

            if not completions:
                return {"status": "Exception", "error": "No code provided"}

            # 评估所有完成的代码
            results = []
            for comp in completions:
                code = input_data.get('prompt') + comp + '\n' + input_data.get('tests')
                result = evaluate_code(code, language)
                # 如果当前代码执行成功,立即返回pass,不再评估后续代码
                if result["status"] == "OK":
                    return {"status": "pass"}
                print(f'Code failed to compile: \n{code}')
                result['compiled_code'] = code
                results.append(result)
                
            # 所有代码都执行失败,返回第一个失败结果
            return results[0]
                
        else:
            return {"status": "Exception", "error": "Invalid input format"}
            
    except Exception as e:
        return {"status": "Exception", "error": str(e)}

def evaluate_code(code, language):
    """评估特定语言的代码
    
    Args:
        code (str): 要评估的代码
        language (str): 编程语言
        
    Returns:
        dict: 包含评估结果的字典
    """
    try:
        # 动态导入对应语言的评估模块
        module_name = f"src.eval_{language.lower()}"
        module = importlib.import_module(module_name)

        # 使用系统临时目录而不是固定的temp目录
        import tempfile
        
        # 创建临时文件
        with tempfile.NamedTemporaryFile(suffix=f".{language}", delete=False) as temp_file:
            temp_file_path = temp_file.name
            temp_file.write(code.encode('utf-8'))
        
        # 调用对应语言的评估函数
        result = module.eval_script(temp_file_path)

        # 清理临时文件
        if os.path.exists(temp_file_path):
            os.unlink(temp_file_path)

        return result

    except ImportError as e:
        return {"status": "Exception", "error": f"Language {language} not supported: {str(e)}"}
    except Exception as e:
        return {"status": "Exception", "error": str(e)}

# 创建Gradio接口
demo = gr.Interface(
    fn=evaluate,
    inputs=gr.JSON(),
    outputs=gr.JSON(),
    title="代码评估服务",
    description="支持多种编程语言的代码评估服务"
)

if __name__ == "__main__":
    demo.launch()