首页 > 解决方案 > 如何处理 f2py 模块中的偶尔分段错误

问题描述

我有一个我正在使用的 f2py 模块。核心代码不是我自己写的,只是f2py wrapper 用的。由于时间限制,以及他的代码只是短期需要的知识,这意味着我想把它扔掉,而不是修复它,我想做的只是捕捉发生段错误时的行为并重试。下面的代码是一个例子:

sums.f90

subroutine bad(a, b, c)

  real, intent(in) :: a, b
  real, intent(out) :: c
  real, allocatable :: d(:)
  real :: r

  call random_number(r)

  if (r < 0.5) then
    print *, d(1)  ! segfault here
  end if

  c = a + b

end subroutine bad

编译:f2py -c sums.f90 -m sums

现在如果我只是反复调用它,那么有时它会起作用,有时它不会。

>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
Segmentation fault: 11
>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
Segmentation fault: 11

现在我知道正确的做法是修复段错误......,但我希望有一种方法可以处理它并从调用 Python 代码中继续前进。这可能吗?

--CURRENT APPROACH-- 我目前的解决方案是在子进程中运行我的程序subprocess.run,如果返回码表明存在段错误,请在放弃之前再试几次。尽管这不是我最初提出的问题,但可能不建议回答这个问题,而且可能不是推荐的做法,而是帮助我应对当前情况的方法。

标签: pythonsegmentation-faultfortranf2py

解决方案


推荐阅读