我想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的最佳方法是什么?我强烈希望不必修改子例程本身。