F2PY无法查看模块范围变量

时间:2015-01-27 03:50:38

标签: python numpy fortran fortran90 f2py

很抱歉对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

但是,这看起来并不像最好的编码实践 它很漂亮"潮湿"。

有什么想法吗?

1 个答案:

答案 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?