从cons重新加载python模块的正确方法

2024-04-29 11:35:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但我收到:

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

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

谢谢。


Tags: 模块方法用户namefromimportprojectmodel
3条回答

按照要求,你能做的就是

>>> 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)

你想怎么做就怎么做。但是,不太好。如果你真的需要经常重新加载模块,我不得不问:为什么?

我的怀疑(根据以前的经验,人们会问类似的问题)是你在测试你的模块。有很多方法可以测试一个模块,而在交互式解释器中手工测试是最糟糕的方法之一。将一个会话保存到文件中,并使用^{}快速修复。或者,将其作为程序编写并使用python -i。不过,唯一真正好的解决方案是使用^{}模块。

如果不是这样,希望是更好的,而不是更坏的。实际上,reload没有什么好用的(事实上,它在3.x中被删除了)。它不能有效地工作——您可能重新加载一个模块,但会留下以前版本的剩余部分。它甚至不能在所有类型的模块上工作——当重新加载时,扩展模块将不能正确地重新加载,有时甚至会严重崩溃。

在交互式解释器中使用它的上下文并没有留下很多选择,比如你在做什么,以及什么是真正的最佳解决方案。除此之外,有时人们使用reload()来实现插件等。这充其量是危险的,而且经常可以使用exec(我们发现自己身处的邪恶领域)或隔离进程来进行不同的操作。

不能有效地使用reload()。

Python不支持重新加载或卸载以前导入的 模块;模块引用使重新加载模块不切实际,因为引用可能存在于程序的许多地方。

Python3完全删除了reload()特性。

对于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

相关问题 更多 >