从控制台重新加载python模块的正确方法

时间:2010-03-28 20:43:28

标签: python

我正在从python控制台调试,并希望每次进行更改时重新加载模块,所以我不必退出控制台并重新输入它。我在做:

>>> from project.model.user import *
>>> reload(user)

但我收到了:

>>>NameError: name 'user' is not defined

重新加载整个用户类的正确方法是什么?有没有更好的方法来做到这一点,也许在调试时自动更新?

感谢。

8 个答案:

答案 0 :(得分:38)

根据要求,你能做的最好的是

>>> from project.models.user import *
>>> import project # get module reference for reload
>>> reload(project.models.user) # reload step 1
>>> from project.models.user import * # reload step 2

如果您直接使用用户模块,而不是执行import *(这几乎不是正确的方法),那将会更好更清洁。那就是

>>> from project.models import user
>>> reload(user)

这可以做你想要的。但是,它不是很好。如果你真的需要经常重新加载模块,我必须问:为什么?

我怀疑(以前人们提出类似问题的经验支持)是你正在测试你的模块。有很多方法可以测试模块,在交互式解释器中手动执行是最糟糕的方法。将您的一个会话保存到文件中并使用doctest进行快速修复。或者,将其作为程序写出来并使用python -i。但是,唯一真正优秀的解决方案是使用unittest模块。

如果不是这样,希望它更好,而不是更糟。 reload实际上并没有很好用(事实上,它已经在3.x中删除了)。它无法有效工作 - 您可能会重新加载模块,但会留下以前版本的剩余部分。它甚至不适用于所有类型的模块 - 扩展模块在重新加载时不会正确重新加载,有时甚至可能会破坏。

在交互式解释器中使用它的上下文并没有对你正在做什么做出很多选择,以及真正最好的解决方案是什么。除此之外,有时人们使用reload()来实现插件等。这最多是危险的,并且可以使用exec(我们发现自己的邪恶领域啊)或隔离过程经常以不同的方式完成

答案 1 :(得分:5)

您不能以有效的方式使用reload()。

Python无法为重新加载或卸载以前导入的内容提供有效支持 模块;模块引用使得重新加载模块变得不切实际,因为引用可能存在于程序的许多地方。

Python 3完全删除了reload()功能。

答案 2 :(得分:4)

不幸的是你必须使用:

>>> from project.model import user
>>> reload(user)

我不知道在交互式提示下会自动重新加载模块的东西......但我没有看到任何不应存在的理由(事实上,它不会太难要实施,要么......)

现在,你可以做这样的事情:

from types import ModuleType
import sys
_reload_builtin = reload
def reload(thing):
    if isinstance(thing, ModuleType):
        _reload_builtin(thing)
    elif hasattr(thing, '__module__') and thing.__module__:
        module = sys.modules[thing.__module__]
        _reload_builtin(module)
    else:
        raise TypeError, "reload() argument must be a module or have an __module__"

答案 3 :(得分:4)

对于python3,重新加载已移至imp模块。你可以使用imp.reload()。您可以参考 this post

>>> import imp
>>> import project # get module reference for reload
>>> imp.reload(project.models.user) # reload step 1
>>> from project.models.user import * # reload step 2

答案 4 :(得分:2)

IPython可以在执行每个新行之前重新加载模块:

%load_ext autoreload
%autoreload 2

每次执行输入的Python代码之前,%autoreload 2重新加载“所有模块(%aimport排除的模块除外)。”

参见文档:

答案 5 :(得分:1)

从Python 3.4开始,您可以使用importlib.reload(module)

>>> from importlib import reload
>>> from project.model import user
>>> reload(user)

答案 6 :(得分:0)

您也可以尝试twisted.python.rebuild.rebuild

答案 7 :(得分:0)

    from test_reload import add_test

其中test_reload是一个模块,而add_test是一个函数 如果您更改了功能add_test,则当然需要重新加载此功能。 那么您可以这样做:


    import imp
    imp.reload(test_reload)
    from test_reload import add_test

这将刷新功能add_test

所以您需要添加

imp.reload(test_reload)
from test_reload import add_test  --add this line in your code