docker_test / app.py
朱东升
requirements update12
141e12d
raw
history blame
4.31 kB
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()