我想在许多自编译的F2PY扩展模块之间共享位于Fortran 90模块中的数据。 F2PY的文档说这不可能,因为Python通常是如何导入共享库的。
F2PY生成包装程序中定义的公共块 签名块。链接的所有Fortran代码都可以看到通用块 使用当前扩展模块,但不适用于其他扩展模块 (此限制是由于Python如何导入共享库)。
[...]
Fortran 90模块数据的F2PY接口类似于Fortran 77 常见块。
由于事实,我必须使用大约100个嵌套的Fortran 90子例程,因此我需要在它们之间共享数据。有什么建议可以实现吗?
我考虑过将每个变量作为参数传递给每个子例程,然后再返回变量,但这听起来有点不对劲。
答案 0 :(得分:3)
尽管只是一种反复试验的方法,但是如何将变量模块和所有子例程放在一个文件中并使用f2py(* 1)进行编译呢?例如...
mytest.f90:
include "vars.f90"
include "sub1.f90"
include "sub2.f90"
vars.f90:
module vars
integer :: n = 100
end
sub1.f90:
subroutine sub1
use vars, only: n
implicit none
print *, "sub1: n = ", n
end
sub2.f90:
subroutine sub2
use vars, only: n
implicit none
print *, "sub2: n = ", n
print *, "adding 1 to n"
n = n + 1
print *, "n = ", n
end
编译:
f2py -c -m mytest mytest.f90
测试:
$ /usr/local/bin/python3
>>> import mytest
>>> mytest.vars.n
array(100, dtype=int32)
>>> mytest.sub1()
sub1: n = 100
>>> mytest.sub2()
sub2: n = 100
adding 1 to n
n = 101
>>> mytest.sub2()
sub2: n = 101
adding 1 to n
n = 102
>>> mytest.vars.n = 777
>>> mytest.sub2()
sub2: n = 777
adding 1 to n
n = 778
(* 1)在上述情况下,只需将所有文件名赋予f2py就足够了,例如
$ f2py -c -m mytest vars.f90 sub1.f90 sub2.f90