elemes/compiler_worker/app.py

74 lines
2.5 KiB
Python

import subprocess
import os
import tempfile
import uuid
from flask import Flask, request, jsonify
app = Flask(__name__)
def run_c_code(code, timeout=5):
with tempfile.TemporaryDirectory() as tmpdir:
source_path = os.path.join(tmpdir, "program.c")
exe_path = os.path.join(tmpdir, "program")
with open(source_path, "w") as f:
f.write(code)
# Compile
try:
compile_res = subprocess.run(
["gcc", source_path, "-o", exe_path],
capture_output=True, text=True, timeout=10
)
if compile_res.returncode != 0:
return {"success": False, "output": compile_res.stdout, "error": compile_res.stderr}
except subprocess.TimeoutExpired:
return {"success": False, "output": "", "error": "Compilation timed out"}
# Run
try:
run_res = subprocess.run(
[exe_path],
capture_output=True, text=True, timeout=timeout
)
return {"success": True, "output": run_res.stdout, "error": run_res.stderr}
except subprocess.TimeoutExpired:
return {"success": False, "output": "", "error": "Program execution timed out"}
except Exception as e:
return {"success": False, "output": "", "error": str(e)}
def run_python_code(code, timeout=5):
with tempfile.NamedTemporaryFile(suffix=".py", delete=False) as tmp:
tmp.write(code.encode('utf-8'))
tmp_path = tmp.name
try:
run_res = subprocess.run(
["python3", tmp_path],
capture_output=True, text=True, timeout=timeout
)
return {"success": True, "output": run_res.stdout, "error": run_res.stderr}
except subprocess.TimeoutExpired:
return {"success": False, "output": "", "error": "Program execution timed out"}
except Exception as e:
return {"success": False, "output": "", "error": str(e)}
finally:
if os.path.exists(tmp_path):
os.remove(tmp_path)
@app.route('/execute', methods=['POST'])
def execute():
data = request.json
code = data.get("code", "")
language = data.get("language", "").lower()
if language == "c":
return jsonify(run_c_code(code))
elif language == "python":
return jsonify(run_python_code(code))
else:
return jsonify({"success": False, "output": "", "error": f"Unsupported language: {language}"}), 400
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)