Как наложить ограничение на весь сценарий в Python - PullRequest
0 голосов
/ 23 октября 2009

Пользователь вводит скрипт python в Python-редакторе Java GUI и может запустить его из редактора. Есть ли способ взять сценарий пользователя и наложить лимит времени на весь сценарий?

Я знаком с тем, как это сделать с функциями / signal.alarm (но я нахожусь на windows & unix Jython), но единственное решение, которое я нашел, - это поместить этот скрипт в метод в другом скрипте, используйте функцию setTrace (), но она удаляет «особенность», что значение глобальных переменных в ней сохраняется. то есть.

try:
 i+=1
except NameError:
 i=0

Значение 'i' увеличивается на 1 при каждом выполнении.

Ответы [ 2 ]

4 голосов
/ 23 октября 2009

Используйте threading.Timer для запуска функции в отдельном потоке после указанной задержки (максимальная продолжительность, которую вы хотите для вашей программы), и в этой функции используйте thread.interrupt_main (обратите внимание, что он в модуле thread, , а не в модуле threading!), чтобы вызвать исключение KeyboardInterrupt в главном потоке.

Более надежный подход (в случае, если сценарий вклинивается в некоторый непрерываемый код, не являющийся Python, чтобы игнорировать прерывания клавиатуры), состоит в том, чтобы порождать «сторожевой процесс» для принудительного уничтожения ошибочного сценария в случае необходимости ( сделайте это , а также вышеупомянутый подход, и немного позже, чем задержка, которую вы используете выше, чтобы дать сценарию возможность запускать свои деструкторы, функции atexit и т. д., если это вообще возможно).

0 голосов
/ 23 октября 2009

Это только предположение, но, может быть, обернуть его с помощью многопоточности или многопроцессорности? Есть поток таймера, который убивает его, когда он истекает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...