我有一个名为sub.py的文件,我希望能够从iPython shell中调用其中的函数。但是,iPython自动加载功能并没有很好地运行。有时它会检测到变化,有时则不会。
我想知道是否有办法在iPython中手动重新加载或卸载并加载模块,而不是调试自动加载。目前我终止shell,再次启动它,重新导入我的模块,然后从那里开始。能够在不杀死iPython shell的情况下进行手动重新加载会很棒。
答案 0 :(得分: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