f2py 不会像 numpy 1.26 那样公开变量。如何在 Python 中访问 Fortran 变量?

问题描述 投票:0回答:1

我曾经通过 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 中读取。应该有更直接的方法。

python numpy f2py
1个回答
0
投票

这一定是 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
...
© www.soinside.com 2019 - 2024. All rights reserved.