我使用f2py封装了一个fortran代码,并在python代码中两次调用了该模块。但是fortran代码中的某些变量值似乎是在这两个调用之间继承的。
我知道fortran变量声明只会执行一次。但是,为什么要在两次模块调用之间保存变量值?每当我在python中调用它时,有什么方法可以重置fortran模块吗?
这是一个测试代码,实际的fortran代码要复杂得多,因此我可能无法简单地清除一些变量。
fortran代码:
subroutine test
integer::aa=1
write(*,*) aa
aa=aa+1
end subroutine test
python代码:
import test
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的“ multiprocessing”中使用该模块。 (如果这个问题不相关,我将其删除。)
EDIT2: 最近,我尝试使用“数据”命令分配值。而且我发现它具有与前面提到的相同的隐式保存问题。
integer::a
data a/1/
a=a+1
write(*,*) a
结果:
2
3
过去常常认为问题只是在诸如“ integer :: a = 1”之类的命令中出现。