防止Python缓存导入的模块

发布于 2021-01-29 19:20:45

使用IPython在Python中开发大型项目(分为多个文件和文件夹)时,我遇到了缓存导入模块的麻烦。

问题是import module,即使模块已更改,指令也只能读取一次模块!因此,每次更改软件包中的内容时,都必须退出并重新启动IPython。痛苦。

有什么方法可以正确地强制重新加载某些模块吗?还是更好地以某种方式阻止Python对其进行缓存?

我尝试了几种方法,但是没有用。特别是我遇到了非常非常奇怪的错误,例如某些模块或变量神秘地变成等于None

我发现的唯一明智的资源是从pyunit重新加载Python模块,但我尚未对其进行检查。我想要这样的东西。

一个很好的选择是让IPython重新启动,或者以某种方式重新启动Python解释器。

那么,如果您使用Python开发,那么您找到了解决该问题的解决方案吗?

编辑

需要说明的是:显然,我知道一些旧变量取决于模块的先前状态。那个我能接受。为什么在Python中强制重载模块而不发生各种奇怪的错误如此困难?

更具体地说,如果我将整个模块放在 一个 文件中,module.py则可以很好地进行以下操作:

import sys
try:
    del sys.modules['module']
except AttributeError:
    pass
import module

obj = module.my_class()

这段代码很漂亮,我可以在不退出IPython几个月的情况下进行开发。

但是 ,每当我的模块由几个子模块组成时,地狱就会崩溃:

import os
for mod in ['module.submod1', 'module.submod2']:
    try:
        del sys.module[mod]
    except AttributeError:
        pass
# sometimes this works, sometimes not. WHY?

无论我的模块在一个大文件中还是在几个子模块中,这对于Python为何如此不同?为什么这种方法行不通?

关注者
0
被浏览
169
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    退出并重新启动解释器是最好的解决方案。任何形式的实时重载或无缓存策略都无法无缝运行,因为不再存在的模块中的对象可能存在,并且模块有时会存储状态,并且即使您的用例确实允许热重载,也是如此,以至于无法考虑值得。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看