F2PY 看不到模块范围的变量
F2PY cannot see module-scope variables
很抱歉,您是 Fortran 90 和 f2py 的新手。
我正在使用 Windows 64 位,Python 3.4 64 位,gfortran。 Numpy 版本是 1.9.1,我
评论了"raise NotImplementedError("仅支持 MS 编译器
在 gnu.py 中使用 gfortran on win64")",按照此 link 中的说明:
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
但是,这看起来不像是最佳编码实践,因为
很漂亮 "wet".
有什么想法吗?
这里有一个解决方法,其中 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?
很抱歉,您是 Fortran 90 和 f2py 的新手。
我正在使用 Windows 64 位,Python 3.4 64 位,gfortran。 Numpy 版本是 1.9.1,我 评论了"raise NotImplementedError("仅支持 MS 编译器 在 gnu.py 中使用 gfortran on win64")",按照此 link 中的说明: 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
但是,这看起来不像是最佳编码实践,因为 很漂亮 "wet".
有什么想法吗?
这里有一个解决方法,其中 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?