Python - Создание «скриптовой» системы

Я создаю приложение wxpython, которое я скомпилирую с помощью различных утилит замораживания, чтобы создать исполняемый файл для нескольких платформ.

программа будет редактором карт для движка игры на основе тайлов

в этом приложении я хочу предоставить систему сценариев, чтобы опытные пользователи могли изменять поведение программы, например изменять данные проекта, экспортировать проект в другой формат и т. Д.

Я хочу, чтобы система работала так.

пользователь поместит скрипт Python, который он хочет запустить, в стилизованное текстовое поле, а затем нажмите кнопку, чтобы выполнить скрипт.

У меня все хорошо, так что далеко это все действительно простые вещи. получить сценарий из текстового поля в виде строки, скомпилировать его в объект cod с помощью встроенной функции compile (), затем выполнить сценарий со статусом exec

script = textbox.text #bla bla store the string
code = compile(script, "script", "exec") #make the code object
eval(code, globals())

, дело в том, что я хочу убедиться, что эта функция не может вызывать какие-либо ошибки или баги
скажите, есть ли в сценарии оператор импорта. вызовет ли это какие-либо проблемы, учитывая, что код был скомпилирован с помощью чего-то вроде py2exe или py2app?
как мне убедиться, что пользователь не может нарушить критическую часть программы, такую ​​как изменение части графического интерфейса пользователя, при этом позволяя им изменять данные проекта (данные хранятся в глобальных свойствах в собственном модуле)? Я думаю, что это означало бы изменить глобальный dict, который передается функции eval.
как я могу убедиться, что этот eval не может вызвать зависание программы из-за длинного или бесконечного цикла? как мне убедиться, что ошибка, возникшая внутри пользовательского кода, не может привести к сбою всего приложения?

в основном, как мне избежать всех тех проблем, которые могут возникнуть, когда пользователь может запускать свой собственный код?

EDIT : Что касается предоставленных ответов

, мне кажется, что ни один из ответов до сих пор не отвечал на мои вопросы да, на них частично ответили, но не полностью. Я прекрасно понимаю, что полностью остановить небезопасный код невозможно. люди слишком умны для одного человека (или даже группы), чтобы придумать все способы обойти систему безопасности и предотвратить их.

на самом деле мне все равно, если они это сделают. Меня больше беспокоит, что кто-то непреднамеренно сломает то, о чем они не знали. если бы кто-то действительно захотел, они могли бы разорвать приложение в клочья с помощью скриптов, но мне было все равно. это будет их экземпляр, и все проблемы, которые они создают, исчезнут, когда они перезапустят приложение, если они не испортили файлы на HD. Я хочу предотвратить проблемы, которые возникают, когда пользователь вводит что-то глупое.
такие вещи, как IOError, SystaxErrors, InfiniteLoopErrors и т. д.

теперь часть, касающаяся области действия, была дана. Теперь я понимаю, как определить, к каким функциям и глобальным объектам можно получить доступ из функции eval . но есть ли способ убедиться, что выполнение их кода может быть остановлено, если оно длится слишком долго?
возможно, система зеленых нитей? (зеленый, потому что это было бы eval, чтобы заставить пользователей беспокоиться о безопасности потоков)

также , если пользователь использует оператор import module для загрузки модуля даже из библиотеки по умолчанию, которая не используется в остальном классе. могло ли это вызвать проблемы с зависанием приложения с помощью Py2exe, Py2app или Freeze? что, если они вызовут модальную часть стандартной библиотеки? Достаточно ли, чтобы модальное окно находилось в том же каталоге, что и замороженный исполняемый файл?

Я хотел бы получить эти ответы, не создавая новый вопрос, но сделаю это, если потребуется.

8
задан Ryex 16 October 2010 в 01:01
поделиться