Spaces:
Sleeping
Sleeping
import gradio as gr | |
import json | |
import importlib | |
import os | |
import sys | |
from pathlib import Path | |
import concurrent.futures | |
import multiprocessing | |
# 添加当前目录和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 = [] | |
max_workers = multiprocessing.cpu_count() | |
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) 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) | |
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: | |
language = language.split('.')[-1] if '.' in language else language # just for go | |
module_name = f"src.eval_{language.lower()}" | |
module = importlib.import_module(module_name) | |
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() | |