很抱歉对Fortran 90和f2py都不熟悉。
我使用的是Windows 64位,Python 3.4 64位,gfortran。 Numpy版本是1.9.1,而我 评论"引发NotImplementedError("仅支持MS编译器 与gfortran在win64")"在gnu.py中,按照此链接的说明: http://scientificcomputingco.blogspot.com.au/2013/02/f2py-on-64bit-windows-python27.html
我在fortran中有一个模块,如下所示,带有模块范围变量dp
:
! testf2py.f90
module testf2py
implicit none
private
public dp, i1
integer, parameter :: dp=kind(0.d0)
contains
real(dp) function i1(m)
real(dp), intent(in) :: m(3, 3)
i1 = m(1, 1) + m(2, 2) + m(3, 3)
return
end function i1
end module testf2py
然后,如果我运行f2py -c testf2py.f90 -m testf2py
它会报告错误,说明未声明dp。
如果我将模块范围复制到功能范围,它将起作用。
! testf2py.f90
module testf2py
implicit none
private
public i1
integer, parameter :: dp=kind(0.d0)
contains
real(dp) function i1(m)
integer, parameter :: dp=kind(0.d0)
real(dp), intent(in) :: m(3, 3)
i1 = m(1, 1) + m(2, 2) + m(3, 3)
return
end function i1
end module testf2py
但是,这看起来并不像最好的编码实践 它很漂亮"潮湿"。
有什么想法吗?
答案 0 :(得分:4)
这是一个变通方法,其中dp
被移动到types
模块,use types
语句被添加到函数i1
。
! testf2py.f90
module types
implicit none
integer, parameter :: dp=kind(0.d0)
end module types
module testf2py
implicit none
private
public i1
contains
real(dp) function i1(m)
use types
real(dp), intent(in) :: m(3, 3)
i1 = m(1, 1) + m(2, 2) + m(3, 3)
return
end function i1
end module testf2py
行动中:
In [6]: import numpy as np
In [7]: m = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
In [8]: import testf2py
In [9]: testf2py.testf2py.i1(m)
Out[9]: 150.0
此更改类似于我在此答案中描述的第三个选项:f2py: Specifying real precision in fortran when interfacing with python?