2013-06-24 116 views
3

我有一個包含兩個Python函數run()和dudt(u,t,...)的代碼。運行調用一個C函數odepack_odeint,它調用一個調用另一個C函數的Fortran子例程LSODA,ode_function調用dudt。如果dudt中有錯誤,可以使用PyErr_Print()通過ode_function打印,但我無法弄清楚如何告訴代碼停止執行。我試過了,在Python C API代碼中引發異常並暫停執行

PyErr_Print() 
PyErr_SetString(errobj, message) 

in ode_function,但後來代碼段錯誤。據我瞭解,接下來應該發生的是ode_function返回NULL或-1或其他東西。但是,LSODA預計ode_function是無效的。

這是一個嘗試修補scipy.integrate.odeint,基於我以前問過的this question

回答

0

pv在this Github issue for Scipy解釋了這些問題。總之,C語言中的setjump()和longjump()原則上可以做到這一點,但這很容易出錯,特別是不是線程安全的。這可能適用於其他類似的應用程序,但使用f2py通常是使Fortran代碼與Python通信的更好方法。