74 lines
2.5 KiB
Python
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)
|