python - 如何处理 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
,如果返回码表明存在段错误,请在放弃之前再试几次。尽管这不是我最初提出的问题,但可能不建议回答这个问题,而且可能不是推荐的做法,而是帮助我应对当前情况的方法。
解决方案
推荐阅读
- apache-spark - 使用 Spark 和 spark-cassandra-connector 3.1.0 获取 NoClassDefFoundError
- c# - c#反射调用未知类型的委托方法
- javascript - AWS S3 如何只允许来自特定域的访问?
- c# - Microsoft Bot Framework 读取 Telegram Start 参数
- firebase - 使用 Flutter 监听 Firestore 中的变化
- javascript - 单击后退按钮时,Popstate 未在 Chrome for Android 上触发
- r - 绘制按 R 中的唯一 ID 分组的汇总每日时间序列
- apache - 文档根目录仅适用于 WWW
- typescript - 我如何在打字稿中输入声明?可能吗?
- node-red - 服务器名称和用户/密码的小胡子格式的节点红色 MSSQL-PLUS 问题