【发布时间】:2011-02-24 12:33:08
【问题描述】:
在使用 IPython 在 Python 中开发大型项目(拆分为多个文件和文件夹)时,我遇到了缓存导入模块的问题。
问题是指令import module 只读取该模块一次,即使该模块已更改!所以每次我更改包中的某些内容时,我都必须退出并重新启动 IPython。很痛苦。
有没有办法正确强制重新加载某些模块?或者,更好的是,以某种方式阻止 Python 缓存它们?
我尝试了几种方法,但都没有奏效。特别是我遇到了非常非常奇怪的错误,例如某些模块或变量神秘地等于None...
我找到的唯一明智的资源是Reloading Python modules,来自pyunit,但我没有检查它。我想要这样的东西。
一个不错的选择是让 IPython 重新启动,或者以某种方式重新启动 Python 解释器。
那么,如果你用 Python 开发,你找到了解决这个问题的方法吗?
编辑
为了清楚起见:显然,我知道一些旧变量取决于模块的先前状态可能会保留。那个我能接受。为什么在 Python 中强制重新加载模块而不发生各种奇怪的错误如此困难?
更具体地说,如果我将整个模块放在 one 文件 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 来说如此不同?为什么这种方法行不通??
【问题讨论】:
-
这实际上是一个非常流行的问题;每个月都会弹出。正如 Mike 指出的那样,当前的共识是重新启动您的解释器。
-
首先,我不明白你为什么要禁止 AttributeError。
del sys.modules[mod]根本不可能引发 AttributeError... 除非您将sys反弹到内置 sys 模块以外的其他东西。难道仅仅是在第二个代码中,你有sys.module(它将用正常的sys引发AttributeError),而在第一个代码中,你有sys.modules? :-P
标签: python import ipython python-module python-import