Я встраиваю интерпретатор Python в программу на Си. Тем не менее, может случиться так, что при запуске некоторого скрипта Python через PyRun_SimpleString()
произойдет бесконечный цикл или он будет выполняться слишком долго. Рассмотрим PyRun_SimpleString("while 1: pass");
Чтобы предотвратить блокирование основной программы, я думал, что смогу запустить интерпретатор в потоке.
Как мне прекратить выполнение скрипта python во встроенном интерпретаторе, работающем в потоке, без прерывания всего процесса?
Можно ли передать исключение переводчику? Должен ли я обернуть сценарий каким-либо другим сценарием, который будет прослушивать сигналы?
PS: я мог бы запустить питон в отдельном процессе, но это не то, что я хочу - если только это не последнее средство ...
Обновление:
Итак, теперь это работает. Спасибо Денис Откидач, еще раз!
Если я вижу это правильно, вы должны сделать две вещи: дать интерпретатору команду остановиться и return -1
в том же потоке, в котором работает PyRun_SimpleString ().
Для остановки у вас есть несколько возможностей: PyErr_SetString(PyExc_KeyboardInterrupt, "...")
или PyErr_SetInterrupt()
- при первом из них Python может выполнить еще несколько инструкций, а затем он останавливается, а при последующем немедленно выполнение прекращается.
Для return -1
вы используете Py_AddPendingCall()
для добавления вызова функции в выполнение Python. В документах упоминается об этом начиная с версии 2.7 и 3.1, но он работает и на более ранних питонах (2.6 здесь). Начиная с версии 2.7 и 3.1 он также должен быть ориентирован на многопотоковое исполнение, то есть вы можете вызывать его, не получая GIL (?).
Чтобы можно было переписать приведенный ниже пример:
int quit() {
PyErr_SetInterrupt();
return -1;
}