Boost.Python и Python исключения
-
06-07-2019 - |
Вопрос
Как я могу сделать осведомленность об исключениях Python кода boost.python?
Например,
int test_for(){
for(;;){
}
return 0;
}
не прерывается на Ctrl-C, если я экспортирую его в python. Я думаю, что другие исключения не сработает так Р>
Это игрушечный пример. Моя настоящая проблема заключается в том, что у меня есть функция C, для вычисления которой могут потребоваться часы. И я хочу прервать это, если, к примеру, это займет больше часа. Но я не хочу убивать экземпляр Python, в функции была вызвана.
Заранее спасибо.
Решение
В вашем коде на C или C ++ установите обработчик сигнала для SIGINT, который устанавливает глобальный флаг, и ваша долгосрочная функция периодически проверяет этот флаг и возвращает его рано, когда этот флаг установлен. В качестве альтернативы, вместо досрочного возврата вы можете вызвать исключение Python, используя Python C API: см. PyErr_SetInterrupt здесь .
Другие советы
Я не уверен, что у boost.python есть решение - возможно, вам придется решить эту проблему самостоятельно. В этом случае это ничем не отличается от обычной обработки сигналов. Простое решение состоит в том, чтобы иметь глобальную переменную, которая изменяется обработчиком сигнала, и на регулярно проверяют эту переменную . Другое решение заключается в использовании setjmp / longjmp, но я думаю, что первый способ лучше всего подходит, когда он применим, потому что он прост и гораздо более удобен в обслуживании.
Обратите внимание, что это специфично для Unix - я не знаю, как это работает в Windows.