cython/python: как поймать в качестве исключения внешнюю функцию, которая выходит вместо возврата

Я использую Cython для интерфейса внешней функции C. Функция (научный код из 100 000 строк кода) выполняет внутреннюю проверку на наличие недопустимых условий и «выходит» в случае их возникновения.

Как я могу заставить Cython обнаруживать и вызывать исключение, когда внешняя функция «выходит» вместо «возврата»?

Редактировать: user2864740 прав, cython фактически завершает работу. (Я запускал функцию внутри python mulitprocessing.Process. Для упрощения я избавился от многопроцессорности.) Теперь вопрос:

Как я могу предотвратить вызов «exit()» из внешней библиотеки для выхода из Cython (или Python, позже). Конструкция try-except этого не улавливает. Можно ли это поймать как исключение вместо того, чтобы весь процесс умирал?

Спасибо!


person drrossum    schedule 02.08.2014    source источник
comment
Я немного удивлен, что не выходит из Cython..   -  person user2864740    schedule 02.08.2014


Ответы (1)


В документации multiprocessing есть рекомендации по "присоединению к зомби-процессам". https://docs.python.org/3/library/multiprocessing.html#programming-guidelines Если в главном процессе вы обнаружите, что рабочий процесс больше не существует, вы можете вызвать исключение.

В качестве альтернативы вы можете попробовать зарегистрировать обработчик atexit из кода Cython http://linux.die.net/man/3/atexit

Третья идея состоит в том, чтобы использовать какую-то библиотеку LD_PRELOAD для переопределения функции exit, чтобы она вызывала исключение Python.

person user1915639    schedule 02.08.2014
comment
Я не могу заставить функцию atexit выполняться после выхода во внешней библиотеке, точно так же, как конструкция try-except не перехватывает исключение. Третий вариант, конечно, работает, но он наименее благоприятен. Остается вопрос: как поймать исключение выхода... - person drrossum; 05.08.2014