簡體   English   中英

如何在iPython Shell中手動重新加載文件

[英]How to do manual reload of file in iPython shell

我有一個名為sub.py的文件,我希望能夠從iPython shell調用其中的函數。 但是,iPython自動重載功能無法很好地運行。 有時它檢測到更改,有時卻檢測不到。

而不是調試自動重新加載,我想知道是否存在一種方法可以手動重新加載或卸載和加載iPython中的模塊。 目前,我終止外殼程序,重新啟動它,重新導入我的模塊,然后從那里開始。 能夠進行手動重新加載而不會殺死iPython shell真是太好了。

我發現自制的%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頂級包:

reimport foo.bar, foo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM