我认为这个问题已经得到了解决,但是我花费了大量时间来寻找答案,包括深入挖掘源代码。第一段展示了我的问题。其余部分展示了问题的基本示例。
我尝试编译一个包含指向另一个更通用的模块的USE
语句的模块。我希望将使用的模块单独保持,以便作为一组通用设置在多个“软件包”中使用。使用f2py编译这两个模块时,从Fortran方面看一切都按照预期工作,但从Python方面看,USE
语句似乎被忽略了。如果允许f2py生成签名文件,则该文件包含适当的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”模块中包含“use test”:! -*- 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
为了说明从Fortran的角度来看b
已经被正确定义,以下代码使用test2并打印出b
的两个值:
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,可在Python中导入并正常工作:
In [1]: import run_test
In [2]: run_test.run_test()
a = 1
b = 2
非常感谢能够提供帮助解决此问题。