当前位置: 首页 > 面试题库 >

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

伏星汉
2023-03-14
问题内容

我正在从python控制台进行调试,并且每次更改时都想重新加载模块,因此不必退出控制台并重新输入。我正在做:

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

但我收到:

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

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

谢谢。


问题答案:

根据要求,您能做的最好的就是

>>> 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(我们所处的邪恶领域)或分离的过程来进行不同的操作。



 类似资料:
  • 本文向大家介绍Python重新加载模块的实现方法,包括了Python重新加载模块的实现方法的使用技巧和注意事项,需要的朋友参考一下 importlib 模块的作用 模块,是一个一个单独的py文件 包,里面包含多个模块(py文件) 动态导入模块,这样就不用写那么多的import代码, 典型的例子: 自动同步服务,每个网站都有一个py文件。主进程里收到同步任务,根据名称来动态导入对应的py文件,这样就

  • 问题内容: 我有一台运行时间较长的Python服务器,并且希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么? 问题答案: 你可以使用reload内置函数重新加载已导入的模块: 在Python 3中,已移至imp模块。在3.4中,不推荐使用importlib,而在中添加了。当定位到3或更高版本时,在调用reload或导入时参考相应的模块。 我认为这就是你想要的。诸如Django开发服务器

  • 问题内容: 我有一个运行时间较长的Python服务器,并且希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么? 问题答案: 您可以使用reload内置函数(仅适用于Python 3.4+)重新导入已导入的模块: 在Python 3中,已移至模块。在3.4中,imp不推荐使用,而reload在中添加了。当定位到3或更高版本时,在调用reload或导入时参考相应的模块。 我认为这就是您想要的

  • 问题 你想重新加载已经加载的模块,因为你对其源码进行了修改。 解决方案 使用imp.reload()来重新加载先前加载的模块。举个例子: >>> import spam >>> import imp >>> imp.reload(spam) <module 'spam' from './spam.py'> >>> 讨论 重新加载模块在开发和调试过程中常常很有用。但在生产环境中的代码使用会不安全,因

  • 问题内容: 我正在使用Ionic Framework开发应用程序,并且有多个视图。路由名称是 app.view1 和 app.view2 。我使用控制器切换到下一个视图,当我单击返回时,app.view1的控制器不再执行,这在我的应用程序中非常重要。 请告诉我如何在每次路由到控制器时执行它。 问题答案: Ionic缓存视图以提高性能。它使用的功能。 Ionic最多可以缓存10个视图,不仅可以配置它

  • 问题内容: 跟进有关重新加载模块的问题,如何从已更改的模块重新加载特定功能? 伪代码: 问题答案: 您想要的是可能的,但是需要重新加载两件事……首先,但是您还必须这样做(假设是包含该语句的模块的名称)。 至于为什么…第一次加载时,将创建一个对象,其中包含一个对象。当您导入到模块,它存储到一个参考。当被调用时,对象被消隐,并且该模块重新执行。这意味着所有引用仍然有效,但是已经创建了一个新对象…因此,