具有回调参数和假定形状数组参数的子程序的F2PY

时间:2017-07-20 15:53:26

标签: python arrays callback fortran f2py

我正在尝试使用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对我来说也很好,只要不涉及回调参数,因此问题似乎是这两者之间的某种相互作用,我无法弄清楚。

2 个答案:

答案 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属性的参数。)