最佳答案
在使用 IPython 在 Python 中开发一个大型项目(分为几个文件和文件夹)时,我遇到了缓存导入模块的麻烦。
问题是指令 import module
只读取模块一次,即使该模块已经更改!因此,每次更改包中的某些内容时,都必须退出并重新启动 IPython。很痛苦。
有没有什么方法可以正确地强制重新加载一些模块? 或者,更好的方法是,以某种方式阻止 Python 缓存它们?
我尝试了几种方法,但都不管用。特别是我遇到了非常非常奇怪的 bug,比如一些模块或变量神秘地等于 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 来说,无论我将模块放在一个大文件中还是放在多个子模块中,为什么会有如此大的不同呢?为什么这种方法不起作用? ?