使用f2py封装Fortran模块时公共常量引发的导入错误排查
问题原因
- 你执行f2py编译时只指定了
photdyn_model.f90,但photdyn_model依赖photdynh模块,photdynh又依赖constants模块——这两个底层依赖模块的源代码没被包含在编译命令里,导致生成的共享库中缺少这些模块的符号定义,Python导入时找不到__photdynh_MOD_ms对应的常量符号。 - Fortran模块间的依赖是编译时必须全部关联的,只编译顶层模块的话,底层依赖模块的代码不会被自动编译并链接到最终的共享库中。
解决方法
修改f2py编译命令,包含所有依赖模块
把所有相关的Fortran源文件按依赖顺序(从底层到顶层)列在编译命令里,确保f2py能编译并链接所有依赖:f2py -c -m photdyn_model constants.f90 photdynh.f90 photdyn_model.f90注意:
-m参数只需要指定一次最终的Python模块名,后续依次列出所有Fortran源文件即可。确保模块内的常量可见性
在constants模块里显式声明常量为公共属性,避免因默认可见性问题导致符号无法导出:module constants implicit none public MJ, pi, MS, RS ! 显式声明常量为公共可访问 real, parameter :: MJ = ... ! 替换为你的实际常量值 real, parameter :: pi = 3.1415926535 real, parameter :: MS = ... real, parameter :: RS = ... end module constants同时确认
photdynh模块中正确使用use constants引入常量,没有遗漏或作用域错误。验证编译结果
编译完成后,可通过nm命令检查共享库是否包含目标符号:nm photdyn_model.cpython-38-x86_64-linux-gnu.so | grep __photdynh_MOD_ms若能输出对应的符号信息,说明编译链接成功。
内容的提问来源于stack exchange,提问作者Siegfried
相关产品推荐
相关产品推荐

