我有一个带有假定形状数组的子例程,该数组还包含一个内部函数:
subroutine test(x)
real x(:)
contains
function a()
end
end
当我尝试使用f2py(f2py -c test.f90 -m test
)进行编译时,将显示以下错误:
gfortran:f77: /tmp/tmphb_l9bkr/src.linux-x86_64-3.7/test-f2pywrappers.f
/tmp/tmphb_l9bkr/src.linux-x86_64-3.7/test-f2pywrappers.f:11:10:
function a() ! in :test:test.f90:test
1
Error: Unclassifiable statement at (1)
/tmp/tmphb_l9bkr/src.linux-x86_64-3.7/test-f2pywrappers.f:13:13:
end function a
1
Error: Expecting END SUBROUTINE statement at (1)
但是,如果我删除了内部函数a()
,或者给数组指定了明确的形状(例如real x(5)
),则可以正常编译。上面给出的代码有什么问题?
情况似乎很特殊。为了更确定发生什么end function a
错误消息,我添加了完整的end语句
subroutine test(x)
real x
contains
function a()
end function a
end subroutine test
从错误消息中可以看到,gfortran错误并非来自原始源代码,而是来自/tmp/
目录中的其他源代码。如果将其打开,则如下所示:
C -*- fortran -*-
C This file is autogenerated with f2py (version:2)
C It contains Fortran 77 wrappers to fortran functions.
subroutine f2pywraptest (x, f2py_x_d0)
integer f2py_x_d0
real x(f2py_x_d0)
interface
subroutine test(x)
real, dimension(:) :: x
function a() ! in :nestedf:nestedf.f90:test
end function a
end subroutine test
end interface
call test(x)
end
它是用于调用子例程的包装器。这样做的原因是使Python可以更轻松地调用您的代码,而无需Python理解假定的shape参数。但是,f2py在创建接口时无法正确理解内部功能。
不幸的是,您必须选择。您可以具有假定的shape参数,也可以具有内部函数。但是f2py不能同时理解两者。否则您将不得不以某种方式拦截f2py临时文件并进行修复,然后再继续操作,但我不知道该怎么做。
包装源中提到的Fortran 77不会让我分心。它们可能意味着包装器本身可以在没有显式接口的情况下被调用,并且源文件是固定格式的。但它显然包含Fortran 90功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句