Как я могу "поймать" ошибку сегмента при импорте модуля F2Py?

Некоторые предыстории, актуальность которых может колебаться:

В настоящее время я владею некоторыми библиотеками F2Py - модулями Python, скомпилированными F2Py из некоторого кода на Fortran. Вы можете рассматривать эти модули как "третье лицо"; В настоящее время у меня нет доступа к исходному коду Фортрана, и я не отвечаю за процесс компиляции.

Сами модули импортируются в программу, которую я помогаю разработать, которая поддерживает скрипты Python и работает на нескольких платформах.

Я пытаюсь предотвратить будущие сбои, возникающие из-за проблем совместимости, вызванных версиями библиотек на компьютере компиляции и несинхронизацией компьютеров пользователя. Уже возникла проблема, когда одна из машин нашего пользователя была заменена несовместимой версией numpy, и это вызвало недопустимую ошибку сегмента при запуске, когда модуль был импортирован.

Вопрос:

Я ищу способ импорта модулей F2Py, но таким образом, чтобы я мог справиться с любыми сбоями сегментов, которые могут возникнуть из-за несовместимых версий библиотек, от которых могут зависеть модули. В настоящее время я проверяю версию numpy перед вызовом import, но я предпочел бы сначала импортировать, а потом "поймать" любые проблемы:

try:
    import module_name
except SegFault:
    # Deal with it.

Возможно ли вообще обнаружить ошибки сегмента - особенно в результате импорта?

3 ответа

Решение

Сегфо не исключение, это сигнал. Вы можете "ловить" сигналы, назначая им обработчики.

import signal

def sig_handler(signum, frame):
    #deal with the signal.. 

signal.signal(signal.SIGSEGV, sig_handler)  

Как насчет попытки импортировать модули внутри подпроцесса?

Например, subprocess.call("python -c 'import module_or_modules_in_question'")

Или вы можете запустить многопроцессорную работу и импортировать модули один за другим в отдельную работу.

Как отмечено в ответе vartecs, вы обычно не можете обнаружить ошибку сегментации. Однако, если вы ищете для отладки кода, который завершается с ошибкой сегментации, и вы не уверены, где это происходит, вы можете использовать faulthandler модуль, доступный с Python 3.3. Это не отловит ошибку, но, по крайней мере, отобразит трассировку, которая может помочь вам точно определить источник. Из документации:

$ python3 -c "import ctypes; ctypes.string_at(0)"
Segmentation fault

$ python3 -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault

Current thread 0x00007fb899f39700 (most recent call first):
  File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
  File "<stdin>", line 1 in <module>
Segmentation fault
Другие вопросы по тегам