【问题标题】:How can I "catch" a seg fault while importing an F2Py module?导入 F2Py 模块时如何“捕获”段错误?
【发布时间】:2012-06-07 09:30:09
【问题描述】:

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

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

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

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

问题:

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

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

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

【问题讨论】:

标签: python import module segmentation-fault f2py


【解决方案1】:

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

import signal

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

signal.signal(signal.SIGSEGV, sig_handler)  

【讨论】:

  • 虽然代码在语法上是正确的,但你不能“处理”一个 SIGSEGV 信号:bugs.python.org/issue1215
  • @totaam 还是这样吗?
  • @gerrit:根据我链接到的 python 票证,是的。也不太可能改变。
  • @totaam 啊,但我看到至少有faulthandler...
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      相关资源
      最近更新 更多