Как я могу "поймать" ошибку сегмента при импорте модуля 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