防止Python缓存导入的模块
防止Python缓存导入的模块
在用IPython开发一个较大的项目(分成多个文件和文件夹)时,我遇到了缓存导入模块的问题。
问题是指令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 # 有时这个方法起作用,有时不起作用。为什么?
为什么对于Python来说,如果我的模块是一个大文件或几个子模块,会有如此不同的情况?为什么这种方法不起作用?