File size: 2,924 Bytes
30b1610
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import json
import importlib
import os
from pathlib import Path

def evaluate(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('completions', [])
            
            if not completions:
                return {"status": "Exception", "error": "No code provided"}
                
            # 评估所有完成的代码
            results = []
            for code in completions:
                result = evaluate_code(code, language)
                results.append(result)
                
            # 如果任一代码执行成功,则返回成功
            if any(r["status"] == "OK" for r in results):
                return {"status": "pass"}
            else:
                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_dir = Path("temp")
        temp_dir.mkdir(exist_ok=True)
        temp_file = temp_dir / f"temp.{language}"

        with open(temp_file, "w") as f:
            f.write(code)

        # 调用对应语言的评估函数
        result = module.eval_script(temp_file)

        # 清理临时文件
        if temp_file.exists():
            temp_file.unlink()

        return result

    except ImportError:
        return {"status": "Exception", "error": f"Language {language} not supported"}
    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()