Python “我怎么能?”;捕获;导入F2Py模块时出现seg故障?

Python “我怎么能?”;捕获;导入F2Py模块时出现seg故障?,python,import,module,segmentation-fault,f2py,Python,Import,Module,Segmentation Fault,F2py,某些背景,其相关性可能会波动: 我目前拥有一些F2Py库——由F2Py从一些Fortran代码编译的Python模块。出于所有目的,您可以将这些模块视为“第三方”;我目前没有访问Fortran源代码的权限,也不负责编译过程 模块本身被导入到我正在帮助开发的一个程序中,该程序具有Python脚本支持,并在多个平台上运行 我试图防止将来由于编译机器上的库版本与用户机器不同步而导致的兼容性问题而导致的崩溃。我们的一台用户机器已更改为不兼容版本的numpy,这导致在导入模块时启动时出现不可接受的seg故

某些背景,其相关性可能会波动:

我目前拥有一些F2Py库——由F2Py从一些Fortran代码编译的Python模块。出于所有目的,您可以将这些模块视为“第三方”;我目前没有访问Fortran源代码的权限,也不负责编译过程

模块本身被导入到我正在帮助开发的一个程序中,该程序具有Python脚本支持,并在多个平台上运行

我试图防止将来由于编译机器上的库版本与用户机器不同步而导致的兼容性问题而导致的崩溃。我们的一台用户机器已更改为不兼容版本的numpy,这导致在导入模块时启动时出现不可接受的seg故障

问题:

我正在寻找一种导入F2Py模块的方法,但这样我就可以处理由于模块可能依赖的不兼容库版本而可能发生的任何seg故障。我目前在调用导入之前检查numpy版本,但我宁愿先导入,然后再“捕获”任何问题:

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

是否有可能捕获seg故障(特别是导入导致的故障)?

SEGFULT不是例外,它是一个错误。您可以通过为信号分配处理程序来“捕获”信号

import signal

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

signal.signal(signal.SIGSEGV, sig_handler)  

尝试导入子流程中的模块如何

例如,subprocess.call(“python-c‘导入模块’或‘问题中的模块’”)

或者,您可以启动一个多处理作业,并在单独的作业中逐个导入模块。

如中所述,您通常无法捕获分段错误。但是,如果您希望调试因分段错误而失败的代码,并且不确定它发生在何处,那么可以使用自Python 3.3以来提供的模块。这不会捕获错误,但它至少会显示一个回溯,这可能有助于您确定错误的来源。从文件中:

$python3-c“导入ctypes;ctypes.string_位于(0)”
分段故障
$python3-q-X faulthandler
>>>导入ctypes
>>>ctypes.string_位于(0)
致命的Python错误:分段错误
当前线程0x00007fb899f39700(最新调用优先):
文件“/home/python/cpython/Lib/ctypes/_init__.py”,第486行,位于
文件“”,中的第1行
分段故障

尽管代码在语法上是正确的,但您无法“处理”SIGSEGV信号:@totaam这仍然是真的吗?@gerrit:根据我链接到的python票证,是的。不太可能改变。@totaam啊,但我看到至少有。。。
$ 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