Spaces:
Sleeping
Sleeping
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() | |