Python F2PY无法查看模块范围变量

Python F2PY无法查看模块范围变量,python,numpy,fortran,fortran90,f2py,Python,Numpy,Fortran,Fortran90,F2py,很抱歉,Fortran 90和f2py都是新手 我使用的是Windows 64位、Python 3.4 64位、gfortran。Numpy版本是1.9.1,我 评论了raise NotImplementedErrorOnly MS编译器支持的 使用gnu.py中win64上的gfortran,按照此链接上的说明: 我有一个fortran语言的模块,编写如下,带有模块范围变量dp: 然后,如果我运行f2py-c testf2py.f90-m testf2py 它将报告一个错误,说明未声明dp

很抱歉,Fortran 90和f2py都是新手

我使用的是Windows 64位、Python 3.4 64位、gfortran。Numpy版本是1.9.1,我 评论了raise NotImplementedErrorOnly MS编译器支持的 使用gnu.py中win64上的gfortran,按照此链接上的说明:

我有一个fortran语言的模块,编写如下,带有模块范围变量dp:

然后,如果我运行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
然而,这看起来不像是最好的编码实践,因为 天气很湿


有什么想法吗?

这里有一个解决方案,其中dp被移动到类型模块,use types语句被添加到函数i1中

在行动中:

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

这个变化类似于我在回答中描述的第三个选项:

这里有一个解决方案,其中dp被移动到类型模块,use types语句被添加到函数i1中

在行动中:

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

这个变化类似于我在回答中描述的第三个选项:

Nice。我认可并怀念我的f2py fortran python日子…:-/@沃伦:谢谢你的回复!很抱歉反应太晚。我也收到了邮件列表中的邮件,但我认为这里的讨论可能会被更多的人访问。我确实有一个问题,我不明白为什么会发生这种情况。我知道f2py不接受kind=kind0.d0,因为使用了kind函数调用。我的问题是:1如果我们先编译模块类型,为什么dp可以这样做?是否因为它是先编译的,所以不再是函数调用?2如果use types,only:dp语句处于模块级别,为什么会失败?如果把它放在功能层面上,它为什么会起作用呢;我希望我有答案。也许@mgilson可以恢复他的f2py fortran python技能并提供一些智慧:-@ShawnWang——我猜这主要是由于f2py解析器不是一个完整的语言解析器。出于好奇,如果您将整数、参数声明移动到原始帖子中的公共dp语句上方,会发生什么?很好。我认可并怀念我的f2py fortran python日子…:-/@沃伦:谢谢你的回复!很抱歉反应太晚。我也收到了邮件列表中的邮件,但我认为这里的讨论可能会被更多的人访问。我确实有一个问题,我不明白为什么会发生这种情况。我知道f2py不接受kind=kind0.d0,因为使用了kind函数调用。我的问题是:1如果我们先编译模块类型,为什么dp可以这样做?是否因为它是先编译的,所以不再是函数调用?2如果use types,only:dp语句处于模块级别,为什么会失败?如果把它放在功能层面上,它为什么会起作用呢;我希望我有答案。也许@mgilson可以恢复他的f2py fortran python技能并提供一些智慧:-@ShawnWang——我猜这主要是由于f2py解析器不是一个完整的语言解析器。出于好奇,如果您将整数、参数声明移动到原始帖子中的公共dp语句上方,会发生什么?
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