Python f2py:从“公开参数”;“用过的”;模块

Python f2py:从“公开参数”;“用过的”;模块,python,numpy,fortran90,f2py,Python,Numpy,Fortran90,F2py,我假设这个问题已经在某个地方得到了解决,但是我花了大量的时间四处寻找答案,包括深入挖掘源代码。我试着把问题写在第一段。其余部分显示了该问题的一个基本示例 我试图编译一个模块,其中包含一个USE语句,指向另一个更通用的模块。我更愿意将使用过的模块分开,这样它就可以作为一组常规设置在多个“包”中使用。当我使用f2py编译这两个模块时,从fortran端宣传的一切都可以正常工作,但是从python端USE似乎被忽略了。如果我允许f2py生成签名文件,则该文件包含适当的USE语句,但如果我完成编译并从结

我假设这个问题已经在某个地方得到了解决,但是我花了大量的时间四处寻找答案,包括深入挖掘源代码。我试着把问题写在第一段。其余部分显示了该问题的一个基本示例

我试图编译一个模块,其中包含一个
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”模块包含“使用测试”:

如果我现在使用
f2py--fcompiler=gfortran-ctest.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
使用“f2py-m run_test-c test.f90 test2.f90 run_test.f90”编译并获得run_test.so后,可以在python中导入run_test并按预期工作:

In [1]: import run_test

In [2]: run_test.run_test()
 a =            1
 b =            2
在此问题上的任何帮助都将不胜感激


TL;DR:当f2py编译包含
USE
的F90模块时,它不会将“used”模块中定义的参数公开为Python中的属性。我找到了这个问题的临时解决方案,但它不是最优的。我将继续研究f2py源代码,以便更好地理解它并修复代码本身中的问题。在此之前,这是我的解决方案,灵感来自

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

以我原来的问题为例:

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
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
从产生的
测试导入。因此
会正确地公开
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
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
[1]中的
:导入测试
在[2]中:打印测试.test.a
1.
在[3]中:打印测试.test.b
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
…/测试溶液/in()
---->1打印测试。测试b
属性错误:b
在[4]中:print test.test2.a
1.
在[5]中:print test.test2.b
2.

尝试联系f2py开发人员。这可能是一个错误。我会尝试一下,但他们在过去几年似乎做得不多。我已将此问题发送到scipy邮件列表。@Vorticity我想在那里阅读您的问题,但尚未找到线索。你能链接它吗?@Juanlu001嘿,很抱歉花了这么长时间才这么做,但我刚刚把这个问题发布到numpy git回购上。我会看看我是否能找出这封邮件,但我没有得到任何回复。git问题位于@Vorticity,你为什么不发布一个答案呢?这将从未答复的列表中删除。