Ограничить количество итераций цикла в python
Делаю проверку сайта с курсами и нужно проверять пользовательский код. Сделал сервер для принятия и выполнения кода от пользователей и обернул его в докер контейнер. Вопрос в следующем: если на сервер придет бесконечный цикл (например, while True: 1+1), как я могу установить количество итераций, после которого будет вылезать исключение?
import re
from flask import Flask, jsonify, request
from loguru import logger
import tempfile
import subprocess
from os.path import abspath
from os import remove
app = Flask(__name__)
@app.route('/exec', methods=['POST'])
def execute_task():
request_data = request.get_json()
with tempfile.TemporaryFile() as stdin:
code_file = open(request_data["uid"], "w")
valid_src = code_validate(request_data["src"])
code_file.write(valid_src)
code_file.close()
data = "\n".join(list(map(str, request_data["input"])))
logger.debug(data)
stdin.write(bytes(data, encoding='utf8'))
stdin.seek(0)
try:
p = subprocess.run(
["python", abspath(code_file.name)],
stdin=stdin, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
encoding='utf-8',
universal_newlines=True,
timeout=15
)
output = p.stdout
remove(abspath(code_file.name))
except Exception as error:
remove(abspath(code_file.name))
if type(error) == subprocess.TimeoutExpired:
output = "Time Out"
else:
raise error
logger.debug(output)
resoult = {
"input" : request_data["input"],
"output" : output
}
return jsonify(resoult)
def code_validate(src):
match = re.search(r"^import (?!math)\S+", src)
if match:
src = "raise Exception('Illegal import')"
return src
if __name__ == '__main__':
app.run(debug=True, use_reloader=True, host="0.0.0.0", port=5000)
Ответы (1 шт):
В функции есть параметр timeout. Возможно это поможет в решении этой проблемы.
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs)
Subprocess