fortran变量值是通过调用python中的fortran模块继承的

fortran变量值是通过调用python中的fortran模块继承的,python,fortran,f2py,Python,Fortran,F2py,我使用f2py包装了一个fortran代码,并在一个python代码中调用了该模块两次。但是fortran代码中的一些变量值似乎是在这两个调用之间继承的 我知道fortran变量声明只执行一次。但是为什么变量值会在两次模块调用之间保存?有没有什么方法可以在每次用python调用fortran模块时重置它 这是一个测试代码,实际的fortran代码要复杂得多,所以我不可能简单地清除一些变量 fortran代码: subroutine test integer::aa=1 write(*,*) aa

我使用f2py包装了一个fortran代码,并在一个python代码中调用了该模块两次。但是fortran代码中的一些变量值似乎是在这两个调用之间继承的

我知道fortran变量声明只执行一次。但是为什么变量值会在两次模块调用之间保存?有没有什么方法可以在每次用python调用fortran模块时重置它

这是一个测试代码,实际的fortran代码要复杂得多,所以我不可能简单地清除一些变量

fortran代码:

subroutine test
integer::aa=1
write(*,*) aa
aa=aa+1
end subroutine test
python代码:

导入测试
test.test()
test.test()
输出将是:

1
2
预期产出应为:

1
1
再次强调,我不能简单地使用

integer::a
a=1
因为我在实际的fortran代码中有太多的子例程,所以很难检查每个变量声明。所以我想知道是否有更明智的方法来解决这个问题


编辑: 迄今为止的评论摘要:

  • python将fortran模块作为库导入,并在两次调用之间保留在内存中。尚未报告有用的“重新加载”方法

  • fortran具有前面提到的隐式保存问题。 cs.rpi.edu/~szymansk/OOF90/bugs.html这里是@Oo.Oo提供的有用链接

  • 关于fortran模块在并行计算中的使用,有一个新的相关问题。正如@Pierre de Buyl所提到的,通过f2py生成的模块不是线程安全的。我是python新手,不知道它是否能够在python的“多处理”中使用该模块。(如果这个问题被认为无关紧要,我将删除它。)


    编辑2: 最近我尝试使用“data”命令来赋值。我发现它与前面提到的隐式save问题相同

    integer::a
    data a/1/
    a=a+1
    write(*,*) a
    
    结果:

    2
    3
    

    以前认为问题只是发生在命令中,比如“integer::a=1”

    如果不要求局部变量具有SAVE属性,则最好更正Fortran代码以删除该属性,而不是通过“重置”模块来解决该问题。@francescalus谢谢。但是在我的fortran代码中,变量没有SAVE属性。看起来有时候变量只是默认保存的(就像我给出的示例)。问题是,我有太多的变量和子程序,所以很难检查所有的变量和子程序。我相信我的问题在一定程度上与那个问题相似。但我的观点是,我不明白为什么在python中调用模块两次时会保存这些值。有许多复杂的大气或海洋模型是用fortran编写的。因此,如果我想在python中使用它们,这是否意味着我别无选择,只能修改整个模型,以便能够在python代码中多次使用它们?我现在将这个问题作为IanH给出的链接的副本来结束。原因很有希望得到解释。还是你仍然期待某种答案?那到底是哪个问题?如果你想问如何发布一个库,那将是另一个问题的主题。