2012-06-07 31 views
2

一些背景资料,其中的相关性可能波动:如何在导入F2Py模块时“捕捉”seg故障?

我目前在一些F2Py库possesion - 通过F2Py一些Fortran代码编译Python模块。对于所有意图和目的,您可以将这些模块视为“第三方”;我目前无法访问Fortran源代码,并且我不负责编译过程。

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

我正试图防止由编译机器上的库版本和用户机器不同步导致的兼容性问题引发的未来崩溃。我们的用户机器中有一台机器已经更换为不兼容的numpy版本,并且导入模块时启动时出现不可接受的故障。

问题:

我正在寻找一种方式来导入F2Py模块,但以这样的方式,这样我可以处理,因为该模块可依赖不兼容的库的版本可能发生的任何赛格故障上。我目前检查numpy的版本调用导入之前,但我宁愿导入,然后再“捕获”任何问题后:

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

正赶上赛格故障 - 特别是作为进口的结果 - 在所有可能的?

回答

2

Segfault并不例外,它是signal。您可以通过分配处理程序来“捕捉”信号。

import signal 

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

signal.signal(signal.SIGSEGV, sig_handler) 
+2

虽然代码语法正确,你不能“对付”一个SIGSEGV信号:http://bugs.python.org/issue1215 – totaam

+0

@totaam是仍然是真的吗? – gerrit

+0

@gerrit:根据我链接到的Python票,是的。不太可能改变。 – totaam

1

如何试图导入子模块内的子模块?

E.g. subprocess.call(“python -c'import module_or_modules_in_question'”)

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

0

正如在vartecs answer中指出的那样,您通常不会发现分段错误。但是,如果您正在寻找调试失败并出现分段错误的代码,并且您不确定发生的位置,则可以使用自Python 3.3起可用的faulthandler模块。这不会捕获错误,但它至少会显示回溯,这可能会帮助您查明原点。从文档:

$ 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