在Python C API代码中引发异常并停止执行

问题描述 投票:3回答:1

我有一个代码,有两个Python函数,run()和dudt(u,t,...)。 run调用一个C函数odepack_odeint,它调用一个Fortran子例程LSODA,它调用另一个调用dudt的C函数ode_function。 如果dudt中有错误,可以使用PyErr_Print()通过ode_function打印,但我无法弄清楚如何告诉代码停止执行。 我试过了,

PyErr_Print()
PyErr_SetString(errobj, message)

在ode_function中,但代码段错误。 据我了解,接下来应该发生的是ode_function返回NULL或-1或其他东西。 但是,LSODA期望ode_function无效。

这是尝试修补scipy.integrate.odeint,基于我之前问过的这个问题

python fortran scipy python-c-api
1个回答
0
投票

关于Scipy的这个Github问题的 pv解释了问题所在。 简而言之,C中的setjump()和longjump()原则上可以做到这一点,但这很容易出错,特别是不是线程安全的。 这可能在其他类似的应用程序中使用,但使用f2py通常是让Fortran代码与Python通信的更好方法。

© www.soinside.com 2019 - 2024. All rights reserved.