我想在许多自编译的F2PY扩展模块之间共享位于Fortran 90模块中的数据. F2PY的文档说这不可能,因为Python通常是如何导入共享库的.
F2PY generates wrappers to common blocks defined in a routine
signature block. Common blocks are visible by all Fortran codes linked
with the current extension module, but not to other extension modules
(this restriction is due to how Python imports shared libraries).[…]
The F2PY interface to Fortran 90 module data is similar to Fortran 77
common blocks.
由于这个事实,我必须使用大约100个嵌套的Fortran 90子例程,因此我需要在它们之间共享数据.有什么建议可以实现吗?
我考虑过将每个变量作为参数传递给每个子例程,然后再返回变量,但这听起来有点不对劲.
解决方法:
尽管只是一种反复试验的方法,但是如何将变量模块和所有子例程放入一个文件中并使用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