gpt4 book ai didi

python - f2py:公开 "used"模块的参数

转载 作者:太空狗 更新时间:2023-10-29 16:58:01 25 4
gpt4 key购买 nike

我认为这个问题已经在某个地方得到解决,但我花了过多的时间寻找答案,包括深入研究源代码。我试图将问题放在第一段中。其余部分显示了问题的基本示例。

我正在尝试编译一个包含 USE 语句的模块,该语句指向另一个更通用的模块。我宁愿将使用过的模块分开,以便它可以作为一组常规设置用于多个“包”中。当我使用 f2py 编译这两个模块时,一切都像 fortran 端所宣传的那样工作,但从 python 端 USE 似乎被忽略了。如果我允许 f2py 生成签名文件,该文件包含适当的 USE 语句,但如果我完成编译并从生成的库中导入,所用模块的参数在包含 use 语句的模块。以下是说明情况的两个模块:

MODULE test
INTEGER, PARAMETER :: a = 1
END MODULE test

MODULE test2
USE test
INTEGER, PARAMETER :: b = 2
END MODULE test2

为了显示中间步骤,我运行了 f2py -h test.pyf test.f90 test2.f90。生成如下签名文件;请注意,“test2”模块包含“使用测试”:

!    -*- f90 -*-
! Note: the context of this file is case sensitive.

python module test ! in
interface ! in :test
module test ! in :test:test.f90
integer, parameter,optional :: a=1
end module test
module test2 ! in :test:test2.f90
use test
integer, parameter,optional :: b=2
end module test2
end interface
end python module test

! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/

如果我现在使用 f2py --fcompiler=gfortran -c test.pyf test.f90 test2.f90 进行编译,我将获得 test.so(与运行 f2py --fcompiler=gfortran 相同-m test -c test.f90 test2.f90 无需先创建签名文件)。在 python 中从该库导入会公开 test.test.a 和 test.test2.b,但不会公开 test.test2.a,如下所示:

In [1]: import test

In [2]: print test.test.a
1

In [3]: print test.test2.b
2

In [4]: print test.test2.a
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/users/solbrig/svn_checkouts/inversion/satmet/branches/solbrig/rootpath/data/users
/GeoIPS/src/test/<ipython-input-4-bffcf464e408> in <module>()
----> 1 print test.test2.a

AttributeError: a

只是为了说明 b 从 fortran 的角度在 test2 中正确定义,下面的代码使用 test2 并打印 bb:

SUBROUTINE run_test()
USE test2
IMPLICIT NONE
print *, "a = ", a
print *, "b = ", b
END SUBROUTINE run_test

用“f2py -m run_test -c test.f90 test2.f90 run_test.f90”编译并得到run_test.so后,run_test可以在python中导入并按预期运行:

In [1]: import run_test

In [2]: run_test.run_test()
a = 1
b = 2

如果您能就此问题提供任何帮助,我们将不胜感激。

TL;DR :当包含 USE 的 F90 模块由 f2py 编译时,它不会将“已使用”模块中定义的参数公开为属性在 Python 中。

最佳答案

我已经找到了这个问题的临时解决方案,但它不是最优的。我将继续研究 f2py 源代码,以便更好地理解它并修复代码本身的问题。在那之前,这是我的解决方案,其灵感来自 chatcannon's comment to the issue I posted to nympy's github .

有几种方法可以从临时角度解决这个问题,包括两种修改 .pyf 文件的方法。我不想修改 .pyf 文件,因为它作为较大包的一部分变得非常麻烦。为避免这种情况,我将 f2py 指令添加到我的 f90 源代码中。

以我原来的问题为例:

MODULE test
INTEGER, PARAMETER :: a = 1
END MODULE test

MODULE test2
USE test
INTEGER, PARAMETER :: b = 2
END MODULE test2

只需在 test2 中添加一个 f2py 指令来向 f2py 展示如何定义 test2.a:

MODULE test
INTEGER, PARAMETER :: a = 1
END MODULE test

MODULE test2
USE test
!f2py integer, parameter :: a ! THIS EXPOSES `a` in `test2`
INTEGER, PARAMETER :: b = 2
END MODULE test2

从生成的 test.so 导入正确地暴露了 test2.a:

In [1]: import test

In [2]: print test.test.a
1

In [3]: print test.test.b
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
.../test_solution/<ipython-input-3-798b14f59815> in <module>()
----> 1 print test.test.b

AttributeError: b

In [4]: print test.test2.a
1

In [5]: print test.test2.b
2

关于python - f2py:公开 "used"模块的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17156125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com