我想f2py
与现代 Fortran 一起使用。特别是我试图让以下基本示例起作用。这是我能生成的最小的有用示例。
! alloc_test.f90
subroutine f(x, z)
implicit none
! Argument Declarations !
real*8, intent(in) :: x(:)
real*8, intent(out) :: z(:)
! Variable Declarations !
real*8, allocatable :: y(:)
integer :: n
! Variable Initializations !
n = size(x)
allocate(y(n))
! Statements !
y(:) = 1.0
z = x + y
deallocate(y)
return
end subroutine f
请注意,这n
是从输入参数的形状推断出来的x
。请注意,y
在子例程的主体内分配和释放。
当我编译这个f2py
f2py -c alloc_test.f90 -m alloc
然后在 Python 中运行
from alloc import f
from numpy import ones
x = ones(5)
print f(x)
我收到以下错误
ValueError: failed to create intent(cache|hide)|optional array-- must have defined dimensions but got (-1,)
pyf
所以我去手动创建和编辑文件
f2py -h alloc_test.pyf -m alloc alloc_test.f90
原来的
python module alloc ! in
interface ! in :alloc
subroutine f(x,z) ! in :alloc:alloc_test.f90
real*8 dimension(:),intent(in) :: x
real*8 dimension(:),intent(out) :: z
end subroutine f
end interface
end python module alloc
修改的
python module alloc ! in
interface ! in :alloc
subroutine f(x,z,n) ! in :alloc:alloc_test.f90
integer, intent(in) :: n
real*8 dimension(n),intent(in) :: x
real*8 dimension(n),intent(out) :: z
end subroutine f
end interface
end python module alloc
现在它运行了,但输出的值z
总是0
. 一些调试打印显示有子程序内n
的值。我认为我缺少一些标题魔法来正确管理这种情况。 0
f
f2py
更一般地说,将上述子例程链接到 Python 的最佳方法是什么?我强烈希望不必修改子程序本身。