3

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

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

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

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

问题:

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

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

是否有可能捕获 seg 错误 -特别是由于导入而导致的错误?

4

3 回答 3

2

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

import signal

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

signal.signal(signal.SIGSEGV, sig_handler)  
于 2012-06-07T09:41:13.570 回答
1

尝试在子进程中导入模块怎么样?

例如 subprocess.call("python -c 'import module_or_modules_in_question'")

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

于 2012-06-07T10:21:45.143 回答
0

vartecs answer中所述,您通常无法捕获分段错误。但是,如果您正在寻找因分段错误而失败的代码并且您不确定它发生在哪里,您可以使用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
于 2016-09-29T10:55:34.750 回答