【问题标题】:How to do manual reload of file in iPython shell如何在 iPython shell 中手动重新加载文件
【发布时间】:2016-10-03 16:58:34
【问题描述】:

我有一个名为 sub.py 的文件,我希望能够从 iPython shell 调用其中的函数。不过,iPython 的自动重载功能并没有很好地工作。有时它会检测到更改,有时则不会。

我想知道是否有办法在 iPython 中手动重新加载或卸载和加载模块,而不是调试自动重新加载。目前我终止了 shell,再次启动它,重新导入我的模块,然后从那里开始。如果能够在不杀死 iPython shell 的情况下进行手动重新加载,那就太好了。

【问题讨论】:

  • 该问题的答案对您没有帮助吗? stackoverflow.com/questions/437589/…
  • 我想知道您的 ipython 重新加载问题是否是由于 .pyc 文件挂起。尝试将环境变量export PYTHONDONTWRITEBYTECODE=1 放入,看看是否能缓解问题。

标签: python ipython


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 2017-08-03
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多