docker_test / app.py
朱东升
requirements update15
64ec244
raw
history blame
4.42 kB
import gradio as gr
import json
import importlib
import os
import sys
from pathlib import Path
import concurrent.futures
# 添加当前目录和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:
list: 包含评估结果的列表
"""
try:
# 确保输入是列表
if not isinstance(input_data, list):
return {"status": "Exception", "error": "Input must be a list"}
results = []
# 使用线程池并行处理多个测试用例
with concurrent.futures.ThreadPoolExecutor() as executor:
# 提交所有任务到线程池
future_to_item = {executor.submit(evaluate_single_case, item): item for item in input_data}
# 获取结果
for future in concurrent.futures.as_completed(future_to_item):
item = future_to_item[future]
try:
result = future.result()
item.update(result)
results.append(item)
except Exception as e:
item.update({"status": "Exception", "error": str(e)})
results.append(item)
return results
except Exception as e:
return {"status": "Exception", "error": str(e)}
def evaluate_single_case(input_data):
"""评估单个代码用例
Args:
input_data: 字典(包含代码信息)
Returns:
dict: 包含评估结果的字典
"""
try:
# 只处理字典类型输入
if not isinstance(input_data, dict):
return {"status": "Exception", "error": "Input item must be a dictionary"}
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", "compiled_code": code}
print(f'Code failed to compile: \n{code}')
result["compiled_code"] = code
results.append(result)
# 所有代码都执行失败,返回第一个失败结果
return results[0]
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()