在许多扩展模块之间通过F2PY共享Fortran 90模块数据

时间:2018-10-23 13:22:01

标签: python fortran shared-libraries f2py

我想在许多自编译的F2PY扩展模块之间共享位于Fortran 90模块中的数据。 F2PY的文档说这不可能,因为Python通常是如何导入共享库的。

  

F2PY生成包装程序中定义的公共块   签名块。链接的所有Fortran代码都可以看到通用块   使用当前扩展模块,但不适用于其他扩展模块   (此限制是由于Python如何导入共享库)。

     

[...]

     

Fortran 90模块数据的F2PY接口类似于Fortran 77   常见块。

Link to Documentation

由于事实,我必须使用大约100个嵌套的Fortran 90子例程,因此我需要在它们之间共享数据。有什么建议可以实现吗?

我考虑过将每个变量作为参数传递给每个子例程,然后再返回变量,但这听起来有点不对劲。

1 个答案:

答案 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