在IPython中重新加载导入

时间:2016-10-26 14:09:40

标签: python ipython f2py

我尝试使用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

如果我使用F2PYf2py3.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中使用autoreloadimportlib.reload(),...),但它们似乎都不适用于此示例。有没有办法强制清理重装/导入?

一些附注:(1)我试图访问的Fortran代码非常庞大,陈旧而且凌乱,所以我不想在那里改变任何东西; (2)我可以很容易地在两次调用之间做test.mod.i = something,但真正的Fortran代码对于这样的解决方案来说太复杂了; (3)我真的更喜欢一种解决方案,我可以将其放在Python代码中,例如设置(autoreload,..)我必须手动放入IPython解释器(忘了一次......)

1 个答案:

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