You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

f2py编译含内部过程的Fortran子程序报错,gfortran可正常编译

报错原因

这个报错是f2py的接口解析逻辑限制导致的:

  • f2py默认会扫描代码中所有带!f2py前缀的编译指令,把对应子程序识别为需要暴露给Python调用的顶层接口
  • 你在嵌套内部子程序tentimes里也加了!f2py intent(inout):array的标记,f2py不支持将Fortran的嵌套内部过程作为导出接口,生成包装代码时会错误地把tentimes的定义放到顶层作用域,完全脱离了example子程序的contains块,直接触发Fortran语法错误:
    • 内部过程不能脱离父过程单独定义,所以报“Unclassifiable statement”、“END SUBROUTINE标签不匹配”错误
    • 脱离父过程显式接口作用域后,假定形状数组array(:,:)没有对应显式接口支持,触发“不能使用延迟形状”错误
    • 自动生成的包装代码不会正确调用内部过程,所以会出现“变量未使用”、“函数未使用”的警告

修复方案

按优先级可以选择以下任意一种方案:

  1. 删除内部子程序的f2py编译指令
    内部子程序是Fortran层内部调用的逻辑,不需要给f2py声明任何参数属性,直接删掉tentimes里的!f2py intent(inout):array这一行即可,不需要修改其他代码,用原编译命令即可正常编译。
  2. 显式指定仅导出目标顶层子程序
    编译时加参数明确告诉f2py只导出需要调用的example接口,忽略其他所有子程序:
    python -m numpy.f2py -c allocate.f90 -m ftest --only example
    
    这种方案不需要修改原有Fortran代码,适合不方便调整源码的场景。
  3. 调整代码结构,把嵌套过程改为顶层子程序
    如果需要同时暴露tentimes给Python调用,可以把tentimes从example的contains块里移出来,变成独立的顶层子程序,两个过程都加对应的f2py声明即可正常编译。

内容的提问来源于stack exchange,提问作者Shriraj Hegde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:36:03