f2py编译含内部过程的Fortran子程序报错,gfortran可正常编译
报错原因
这个报错是f2py的接口解析逻辑限制导致的:
- f2py默认会扫描代码中所有带
!f2py前缀的编译指令,把对应子程序识别为需要暴露给Python调用的顶层接口 - 你在嵌套内部子程序
tentimes里也加了!f2py intent(inout):array的标记,f2py不支持将Fortran的嵌套内部过程作为导出接口,生成包装代码时会错误地把tentimes的定义放到顶层作用域,完全脱离了example子程序的contains块,直接触发Fortran语法错误:- 内部过程不能脱离父过程单独定义,所以报“Unclassifiable statement”、“END SUBROUTINE标签不匹配”错误
- 脱离父过程显式接口作用域后,假定形状数组
array(:,:)没有对应显式接口支持,触发“不能使用延迟形状”错误 - 自动生成的包装代码不会正确调用内部过程,所以会出现“变量未使用”、“函数未使用”的警告
修复方案
按优先级可以选择以下任意一种方案:
- 删除内部子程序的f2py编译指令
内部子程序是Fortran层内部调用的逻辑,不需要给f2py声明任何参数属性,直接删掉tentimes里的!f2py intent(inout):array这一行即可,不需要修改其他代码,用原编译命令即可正常编译。 - 显式指定仅导出目标顶层子程序
编译时加参数明确告诉f2py只导出需要调用的example接口,忽略其他所有子程序:
这种方案不需要修改原有Fortran代码,适合不方便调整源码的场景。python -m numpy.f2py -c allocate.f90 -m ftest --only example - 调整代码结构,把嵌套过程改为顶层子程序
如果需要同时暴露tentimes给Python调用,可以把tentimes从example的contains块里移出来,变成独立的顶层子程序,两个过程都加对应的f2py声明即可正常编译。
内容的提问来源于stack exchange,提问作者Shriraj Hegde
相关产品推荐
相关产品推荐

