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