我正在尝试使用F2PY来包装一个fortran子例程,该子例程将函数和假定形状数组作为参数。这会导致错误。我正在使用GNU Fortran(GCC)4.8.5 20150623(Red Hat 4.8.5-11)和F2PY版本2与Scientific Linux 7.3。
最小的例子是文件' callback.f90 ' :
!file callback.f90
subroutine sub(arr,func)
implicit none
integer,intent(in),dimension(:) :: arr
external func
integer :: func
integer :: i
i = arr(1)
print *, func(i)
end subroutine sub
我用
将它包装在终端中f2py -m pymod -h sign.pyf callback.f90
f2py -c sign.pyf callback.f90
这导致以下错误(翻译自德语):
gfortran:f77: /usr/tmp/tmpsADmTS/src.linux-x86_64-2.7/pymod-f2pywrappers.f
/usr/tmp/tmpsADmTS/src.linux-x86_64-2.7/pymod-f2pywrappers.f:6.19:
use sub__user__routines
1
Error: Module file »sub__user__routines.mod« at (1) can't be opened
for reading: File not found
然而,如果 arr 不是假定的形状,而是固定大小,这种方法完全正常。具有假定形状数组的F2PY对我来说也很好,只要不涉及回调参数,因此问题似乎是这两者之间的某种相互作用,我无法弄清楚。
答案 0 :(得分:1)
似乎确实是f2py中的错误。问题是,f2py错误地将use ...__user__routines
插入到在途中编译的Fortran文件中。我已将其提交到https://github.com/numpy/numpy/issues/17797上。
由percuse评论的拟议修复似乎一见钟情。在dimension(:)
文件中用dimension(*)
替换.pyf
进行了f2py
编译。我尚未检查是否会破坏界面。
答案 1 :(得分:0)
假设形状的数组伪参数是由大多数(所有?)Fortran编译器使用描述符(有时称为dope向量)实现的。这意味着你的例子中子例程sub的第一个参数(arr)不仅仅是数组的地址。它是一个结构的地址,其中包含数组数据的地址以及数组边界信息等。我不熟悉F2PY的内部工作原理,但也许它不支持by-descriptor参数? (by-descriptor参数的其他示例是具有POINTER或ALLOCATABLE属性的参数。)