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

使用f2py编译Fortran90代码生成空Python模块,如何调用子程序?

解决方案

问题根源:f2py默认只会识别并导出Fortran**模块(module)**或独立子程序中的可调用接口,而你当前的代码是program结构,其contains块内的子程序属于程序内部私有逻辑,不会被f2py导出,因此导入Python后模块为空。

下面提供两种可行的解决方法:

方法一:将Program改为Module(推荐)

直接调整原代码结构,把program替换为module,将需要调用的子程序暴露为模块的公共接口,同时保留原程序的逻辑:

修改后的Fortran代码示例:

module code_name
    implicit none
    ! 保留原program中的变量定义(如需在子程序间共享)
    ! 可通过`private`声明隐藏不需要暴露的变量,仅公开需要调用的子程序
    private
    public run  ! 仅将run子程序设为可外部调用

contains

subroutine run
    ! 原run子程序的完整代码
end subroutine run

! 其他需要在Python中调用的子程序也放在contains块内

end module code_name

编译步骤:

  1. 先生成接口文件(可选,用于确认f2py已识别到run子程序):
f2py code_name.f90 -m code_name -h code_name.pyf
  1. 执行编译命令:
f2py -c -lgomp -lcfitsio.10 -L/usr/local/opt/cfitsio/lib/ code_name.pyf code_name.f90

编译完成后,在Python中导入模块即可调用:

import code_name
code_name.run()

方法二:保留原Program,提取子程序到独立Module

如果需要保留原program的可独立编译运行能力,可以将需要调用的子程序提取到单独的模块中,原program通过use语句调用该模块:

  1. 新建模块文件code_name_mod.f90:
module code_name_mod
    implicit none
    public run  ! 公开run子程序

contains

subroutine run
    ! 复制原program中run子程序的完整代码
end subroutine run

! 其他需要调用的子程序也放入此模块

end module code_name_mod
  1. 修改原program文件code_name.f90:
program code_name
    use code_name_mod  ! 引入模块
    implicit none
    call run  ! 调用模块中的run子程序
end program code_name
  1. 编译时同时包含两个文件:
f2py -c -lgomp -lcfitsio.10 -L/usr/local/opt/cfitsio/lib/ -m code_name code_name_mod.f90 code_name.f90

Python中调用方式:

import code_name
code_name.run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:42:52