[Numpy-discussion] error handling with f2py?

Pearu Peterson pearu@cens.ioc...
Fri Jan 16 07:16:18 CST 2009


On Thu, January 15, 2009 6:17 pm, Sturla Molden wrote:
> Is it possible to make f2py raise an exception if a fortran routine
> signals an error?
>
> If I e.g. have
>
>      subroutine foobar(a, ierr)
>
> Can I get an exception automatically raised if ierr != 0?

Yes, for that you need to provide your own fortran call code
using f2py callstatement construct. The initial fortran call
code can be obtained from f2py generated <modulename>module.c file,
for instance.

An example follows below:

Fortran file foo.f:
-------------------

      subroutine foo(a, ierr)
      integer a
      integer ierr
      if (a.gt.10) then
        ierr=2
      else
         if (a.gt.5) then
            ierr=1
         else
            ierr = 0
         end if
      end if
      end

Generated (f2py -m m foo.f) and then modified signature file m.pyf:
-------------------------------------------------------------------

!    -*- f90 -*-
! Note: the context of this file is case sensitive.

python module m ! in
    interface  ! in :m
        subroutine foo(a,ierr) ! in :m:foo.f
            integer :: a
            integer :: ierr
            intent (in, out) a
            intent (hide) ierr
            callstatement '''
            (*f2py_func)(&a, &ierr);
            if (ierr==1)
            {
              PyErr_SetString(PyExc_ValueError, "a is gt 5");
              }
            if (ierr==2)
              {
                PyErr_SetString(PyExc_ValueError, "a is gt 10");
              }
            '''
        end subroutine foo
    end interface
end python module m

! This file was auto-generated with f2py (version:2_5618).
! See http://cens.ioc.ee/projects/f2py2e/

Build the extension module and use from python:
-----------------------------------------------

$ f2py -c m.pyf foo.f
$ python
>>> import m
>>> m.foo(30)
---------------------------------------------------------------------------
<type 'exceptions.ValueError'>            Traceback (most recent call last)

/home/pearu/test/f2py/exc/<ipython console> in <module>()

<type 'exceptions.ValueError'>: a is gt 10
>>> m.foo(6)
---------------------------------------------------------------------------
<type 'exceptions.ValueError'>            Traceback (most recent call last)

/home/pearu/test/f2py/exc/<ipython console> in <module>()

<type 'exceptions.ValueError'>: a is gt 5
>>> m.foo(4)
4

HTH,
Pearu





More information about the Numpy-discussion mailing list