使用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
编译步骤:
- 先生成接口文件(可选,用于确认f2py已识别到run子程序):
f2py code_name.f90 -m code_name -h code_name.pyf
- 执行编译命令:
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语句调用该模块:
- 新建模块文件
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
- 修改原program文件
code_name.f90:
program code_name use code_name_mod ! 引入模块 implicit none call run ! 调用模块中的run子程序 end program code_name
- 编译时同时包含两个文件:
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
相关产品推荐
相关产品推荐

