f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码
请看示例F77文件:
- C FILE: CALLBACK.F
- SUBROUTINE FOO(FUN,R)
- EXTERNAL FUN
- INTEGER I
- REAL*8 R
- Cf2py intent(out) r
- R = 0D0
- DO I=-5,5
- R = R + FUN(I)
- ENDDO
- END
- C END OF FILE CALLBACK.F
在DOS窗口输入:
- f2py -c -m callback callback.f
下面是测试:
- >>> import callback
- >>> print callback.foo.__doc__
- foo - Function signature:
- r = foo(fun,[fun_extra_args])
- Required arguments:
- fun : call-back function
- Optional arguments:
- fun_extra_args := () input tuple
- Return objects:
- r : float
- Call-back functions:
- def fun(i): return r
- Required arguments:
- i : input int
- Return objects:
- r : float
- >>> def f(i): return i*i
- ...
- >>> print callback.foo(f)
- 110.0
- >>> print callback.foo(lambda i:1)
- 11.0
更纤细的说明,请看官方网站:
http://cens.ioc.ee/projects/f2py2e/
可以再看下面的例子:
- subroutine calculate(x,n)
- cf2py intent(callback) func
- external func
- c The following lines define the signature of func for F2PY:
- cf2py real*8 y
- cf2py y = func(y)
- c
- cf2py intent(in,out,copy) x
- integer n,i
- real*8 x(n)
- do i=1,n
- x(i) = func(x(i))
- end do
- end
在DOS窗口输入:
- f2py -c -m foo calculate.f
下面是在Python中测试:
- >>> import foo
- >>> foo.calculate(range(5), lambda x: x*x)
- array([ 0., 1., 4., 9., 16.])
- >>> import math
- >>> foo.calculate(range(5), math.exp)
- array([ 1. , 2.71828175, 7.38905621, 20.08553696, 54.59814835])
以上都是官方的示例