我曾经通过 f2py 编译 Python 来运行一组 Fortran 95 子例程。在 Fortran 源代码中,我有一个带有全局变量的模块:
MODULE GEOPLOT_GLOBALS
IMPLICIT NONE
INTEGER, PARAMETER :: N_MAX = 16
INTEGER, PARAMETER :: I_MAX = 18
INTEGER, PARAMETER :: J_MAX = 72
...
END MODULE GEOPLOT_GLOBALS
编译后的文件名为“geoplot.cpython-312-darwin.so”,位于名为“geo”的子文件夹中。当在 numpy 1.26 中使用 f2py 时,我可以这样做:
import geo.geoplot as geo
maxN = geo.geoplot_globals.n_max
maxI = geo.geoplot_globals.i_max
maxJ = geo.geoplot_globals.j_max
现在,使用 numpy 2.0.1,我执行相同的操作,但收到错误消息
AttributeError: module 'geo.geoplot' has no attribute 'geoplot_globals'
可以通过列出
__dict__
属性或使用 getmembers
模块来确认:它们都列出了包含源代码的 Fortran 子例程和模块,除了 geoplot_globals
模块仅包含变量声明。
所以我的问题是:使用 numpy 2.0 时,我应该如何从 Python 访问全局 Fortran 变量?并且请不要建议将所有内容写入 Fortran 中的文件,而只是在 Python 中读取。应该有更直接的方法。
这一定是 f2py 中的错误,我将提交错误报告。
让我摆脱困境的是一个丑陋的解决方法:我只是向模块添加了一些无用的虚拟代码,就像这样:
MODULE GEOPLOT_GLOBALS
USE MOD_TYPES
IMPLICIT NONE
INTEGER, PARAMETER :: N_MAX = 16
INTEGER, PARAMETER :: I_MAX = 18
INTEGER, PARAMETER :: J_MAX = 72
...
CONTAINS
SUBROUTINE DUMMY (UNSINN)
INTEGER :: UNSINN
OPEN(UNIT=29, FILE="FOR29.txt", STATUS = 'UNKNOWN')
WRITE(29,"(I8)") UNSINN
CLOSE (29)
END SUBROUTINE DUMMY
END MODULE GEOPLOT_GLOBALS
现在之前缺失的模块已被转移到Python中,并且可以通过通常的方式访问。
>>> print(geo.geoplot_globals.__doc__)
n_max : 'i'-scalar
i_max : 'i'-scalar
j_max : 'i'-scalar
...