我尝试使用F2PY
访问某些Fortran子例程,但在从IPython连续调用期间我遇到了以下问题。拿这个最小的Fortran代码(希望我没有编写任何愚蠢的代码;我的Fortran有点生锈...... ):
! test.f90
module mod
integer i
contains
subroutine foo
i = i+1
print*,i
end subroutine foo
end module mod
如果我使用F2PY
(f2py3.5 -c -m test test.f90
)编译它,请在Python中导入并调用它两次:
# run.py
import test
test.mod.foo()
test.mod.foo()
结果输出为:
$ python run.py
1
2
因此,在foo()
的每次调用中,i
都会递增,这应该会发生。但是在run.py
的不同调用(来自命令行或IPython解释器)之间,所有内容都应该是" reset",即打印的计数器应该从每个调用的1
开始。从命令行调用run.py
时会发生这种情况,但如果我从IPython多次调用脚本,i
会不断增加:
In [1]: run run.py
1
2
In [2]: run run.py
3
4
我知道有很多帖子显示如何重新加载导入(在IPython中使用autoreload
,importlib.reload()
,...),但它们似乎都不适用于此示例。有没有办法强制清理重装/导入?
一些附注:(1)我试图访问的Fortran代码非常庞大,陈旧而且凌乱,所以我不想在那里改变任何东西; (2)我可以很容易地在两次调用之间做test.mod.i = something
,但真正的Fortran代码对于这样的解决方案来说太复杂了; (3)我真的更喜欢一种解决方案,我可以将其放在Python代码中,例如设置(autoreload
,..)我必须手动放入IPython解释器(忘了一次......)
答案 0 :(得分:0)
如果您可以稍微更改您的fortran代码,您可以重置而无需重新导入(可能更快)
这一变化是关于引入i
作为共同点并从外部重置它。您更改的fortran代码将看起来
! test.f90
module mod
common /set1/ i
contains
subroutine foo
common /set1/ i
i = i+1
print*,i
end subroutine foo
end module mod
从python重置变量i
,如下所示:
import test
test.mod.foo()
test.mod.foo()
test.set1.i = 0 #reset here
test.mod.foo()
这应该产生如下结果:
python run.py
1
2
1