2016-10-03 30 views
0

我有一個名爲sub.py的文件,我希望能夠從iPython shell中調用它中的函數。不過,iPython的自動重載功能還沒有很好地發揮作用。有時它會檢測到變化,有時它不會。如何在iPython shell中手動重新加載文件

而不是調試autoreload,我想知道是否有辦法在iPython中手動重新加載或卸載和加載模塊。目前我終止shell,再次啓動它,重新導入我的模塊,然後從那裏開始。能夠在不殺死iPython shell的情況下進行手動重新加載會很棒。

+0

不要從這個問題的答案幫助你嗎? http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module – skovorodkin

+0

我不知道你的ipython重新加載的麻煩可能是由於.pyc文件掛起。試着把環境變量'export PYTHONDONTWRITEBYTECODE = 1'放進去,看看它是否能緩解問題。 – wim

回答

1

我發現我的家釀%reimport是在這種情況下非常有用:

def makemagic(f): 
    name = f.__name__ 
    if name.startswith('magic_'): name = name[6:] 
    def wrapped(throwaway, *pargs, **kwargs): return f(*pargs,**kwargs) 
    if hasattr(f, '__doc__'): wrapped.__doc__ = f.__doc__ 
    get_ipython().define_magic(name, wrapped) 
    return f 

@makemagic 
def magic_reimport(dd): 
    """ 
    The syntax 

     %reimport foo, bar.* 

    is a shortcut for the following: 

     import foo; foo = reload(foo) 
     import bar; bar = reload(bar); from bar import * 
    """ 
    ipython = get_ipython().user_ns 
    for d in dd.replace(',', ' ').split(' '): 
     if len(d): 
      bare = d.endswith('.*') 
      if bare: d = d[:-2] 
      exec('import xx; xx = reload(xx)'.replace('xx', d), ipython) 
      if bare: exec('from xx import *'.replace('xx', d), ipython) 

一旦疑難雜症的是,當有涉及封裝的子模塊,你必須reimport子模塊,並然後頂級套餐:

reimport foo.bar, foo 
相關問題