Каким самым легких способом скомпилировать код в коде на Python?
Делаю бота, которые задает задачи, а решение нужно скинуть ему как сообщения.
Каким самым простым и еффективным способом я могу скомпилировать код в коде, пройтись по всех тестам, которые у меня есть в массиве(input файлами) и узнать output? Желательно самый быстрый вариант + защита от вредоносных програм(например разрешить использование только определенных библиотек) + временое ограничения(защита от while true, например) + желательно(но не обязательно) время выполнение программы.
Конечно, можно установить систему типа ejudge, но это довольно громосткий способ и много лишнего.
Например, можно создавать докер-контейнер без сети с полученным скриптом и установленными определёнными модулями, который убивать, если он не завершился по таймауту. Если даже туда засунут рассылку спама, ничего не выйдет, ведь сеть недоступна.
ITpie, Docker - система запуска приложений в изолированном окружении, используя доступные в Linux технологии: namespaces и cgroups. В каком-то смысле контейнеры - это "лёгкие" виртуальные машины, которые работают на одном и том же ядре, но отделены от основной системы и друг от друга и имеют свою собственную сеть (network namespace), точки монтирования (mount namespace, развитие идеи chroot), процессы (pid namespace) и ещё некоторые другие сущности. Необязательно использовать именно докер, можно вообще создавать namespace'ы для запускаемого процесса явным образом, но докером можно сделать это довольно быстро.
В общих чертах это может выглядеть так. Сделаем образ для Docker, в котором будет python и нужные модули. Для каждого скрипта будем его вместе с тестовыми данными подсовывать в создаваемый для теста контейнер, в котором отсутствует доступ к сети (при желании можно также навертеть ограничений на использование процессора, памяти итд). Если контейнер не завершился за оговоренное время, будем гасить его принудительно.
Нужен Linux с Docker, запустить build.sh, чтобы собрать образ (он будет называться testing), затем можно запустить test.sh, который запустит скрипт script.py, внутри которого бесконечный цикл. В test.sh раз в 5 секунд идёт проверка состояния контейнера, если через 60/5=12 проверок контейнер ещё не завершился - он будет принудительно завершён. У меня скрипт устевает выполнить цикл 72 раза, это из-за того, что каждый вызов docker inspect для получения состояния контейнера тратит примерно секунду.
можно сделать так чтобы решение ему скидывать в виде файла а компилировать при помощи встроенного в python метода compile. А количество пройденных тестов выводить при помощи счетчика (как вариант)
@alexbprofit
compile не защитит от внедрения произвольного кода и не позволит избежать бесконечного цикла, разрастания по памяти, обращения в сеть и прочих посторонних вещей, от которых мы пытаемся защититься.