防止Python缓存导入的模块

9 浏览
0 Comments

防止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来说,如果我的模块是一个大文件或几个子模块,会有如此不同的情况?为什么这种方法不起作用?

0