Вопрос

Как я могу сделать осведомленность об исключениях 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top