繁体   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