Как я могу «поймать» ошибку seg при импорте модуля F2Py?

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

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

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

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

Вопрос:

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

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

Является ли улавливание seg неисправностей – в частности, в результате импорта – вообще возможно?

3 Solutions collect form web for “Как я могу «поймать» ошибку seg при импорте модуля F2Py?”

Segfault не является исключением, это сигнал . Вы можете «поймать» сигналы, назначив им обработчики.

 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 
  • Программа Fortran не работает в зависимости от оператора записи перед вызовом подпрограммы
  • f2py: указание реальной точности в fortran при взаимодействии с python?
  • f2py, функция Python, которая возвращает массив (векторнозначная функция)
  • Как передать массив (7, 3, 3, 3) в подпрограмму fortran?
  • setup.py для пакетов, которые зависят как от cython, так и от f2py
  • Ошибка malloc в f2py
  • Функции функции f2py с массивом
  • Можно ли обернуть функцию из общей библиотеки, используя F2PY?
  • Python - лучший язык программирования в мире.