使用f2py调用Fortran95函数遇AttributeError:模块无对应属性
解决f2py调用Fortran函数时的AttributeError问题
问题原因
f2py对未封装在模块中的独立Fortran函数处理时,会受Fortran名称修饰规则(如自动加下划线、大小写转换)或默认导出逻辑影响,导致编译后的Python模块无法直接识别目标函数,单纯修改函数名大小写无法解决底层导出问题。
解决方案1:将Fortran函数封装到模块中(推荐)
f2py对Fortran模块的支持更完善,能明确暴露函数接口,是最可靠的解决方式。
修改你的Fortran代码,把函数放入模块:
module primemod implicit none contains function isprima(p) integer, intent(in) :: p integer :: i logical :: isprima isprima = .true. if (p /= 2) then testloop: do i = 2, int(floor(sqrt(real(p)))) if (modulo(p, i) == 0) then isprima = .false. exit testloop end if end do testloop end if end function isprima end module primemod
重新执行编译命令:
python -m numpy.f2py -c -m isprim f2p.f95
修改Python调用代码,通过子模块访问函数:
import numpy as np import isprim print(isprim.primemod.isprima(5)) # 输出:True
解决方案2:编译时强制指定导出函数
若不想修改Fortran代码,可在编译时通过only:参数强制指定要导出的函数,规避f2py的默认处理逻辑:
执行编译命令:
python -m numpy.f2py -c -m isprim f2p.f95 only: isprima :
此时Python代码无需修改,直接调用即可:
import numpy as np import isprim print(isprim.isprima(5)) # 输出:True
额外排查方式
若仍有疑问,可先生成接口文件查看f2py的处理逻辑,确认函数是否被正确定义:
python -m numpy.f2py f2p.f95 -m isprim -h isprim.pyf
查看生成的isprim.pyf文件,检查函数的名称和导出状态是否符合预期。
内容的提问来源于stack exchange,提问作者Josh Brunow
相关产品推荐
相关产品推荐

