Как перехватить и обработать фатальную ошибку при сбое инициализации Py_initialize?

#c #python #c

#c #python #c

Вопрос:

Я встраиваю python в C dll (так что в конечном итоге я могу поместить его в xll). При неправильной настройке Py_Initialize документируется как окончательный сбой — см. http://docs.python.org/c-api/init.html , «… это фатальная ошибка, если инициализация завершается неудачно»..

Возможно ли перехватить эту ошибку и как?

Подумав, может быть, глобальный перехват Windows?

Ответ №1:

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

Ответ №2:

Фатальная ошибка вызывается вызовом Py_FatalError , который прощается с пояснительным сообщением, а затем вызывает abort() .

Комментарии:

1. Это нехорошо, не так ли? Я добавил обработчик сигналов для SIGABRT, обработчик выхода и обработчик выхода, и, к сожалению, ни один из них не срабатывает.

Ответ №3:

На данный момент решение Jason кажется единственным способом, но это не распространяется на случаи, когда Python выходит из строя из-за неустранимой ошибки где-то позже Py_Initialize() , поэтому приложение для встраивания не может обработать его более изящным способом (показать сообщение GUI и только затем прервать).

Я создал исправление и проблему в Python bug tracker, перекрестно ссылаясь на этот вопрос: http://bugs.python.org/issue30560