我认为this post 应该可以帮助你
编辑:
为了确保此信息的可用性(以防链接失效或类似情况),我将在此处包含来自tutor mailing list 的原始消息:
2006 年 8 月 14 日,迪克·摩尔斯写道:
实际上,我的问题是,在使用 IDLE 进行一些导入后
模块和变量的初始化,如何将其返回给它
初始状态,无需关闭并重新打开它。
所以,例如在我完成之后
>>> import math, psyco
>>> a = 4**23
如何在不关闭 IDLE 的情况下清除它们?
(我曾经知道怎么做,但我忘记了。)
嗨,迪克,
通常这需要从“模块注册表中删除并删除
在代码中引用它。如果你有一个 真正 很好用的模块(比如
一个将配置参数导入每个模块),那么您将拥有一个
从每个模块中删除它的附加步骤。另外,如果你有使用
“from psyco import ...”,那么您将无法释放模块并
对模块的引用很容易(是从那个模块,还是从
第三个模块?请参阅“如果偏执:下面的代码)。
下面的函数按名称从 Python 解释器中删除一个模块,
“paranoid”参数是要从其他变量中删除的变量名列表
模块(据说与模块一起被删除)。非常小心
偏执的参数;如果您的
函数和类在不同的模块中命名相同。一种常见的
发生这种情况是异常的“错误”。很多图书馆都有
“catch-all”异常在模块中称为“error”。如果您还命名了您的
异常“错误”并决定将其包含在偏执列表中……那里
去很多其他异常对象。
def delete_module(modname, paranoid=None):
from sys import modules
try:
thismod = modules[modname]
except KeyError:
raise ValueError(modname)
these_symbols = dir(thismod)
if paranoid:
try:
paranoid[:] # sequence support
except:
raise ValueError('must supply a finite list for paranoid')
else:
these_symbols = paranoid[:]
del modules[modname]
for mod in modules.values():
try:
delattr(mod, modname)
except AttributeError:
pass
if paranoid:
for symbol in these_symbols:
if symbol[:2] == '__': # ignore special symbols
continue
try:
delattr(mod, symbol)
except AttributeError:
pass
那么你应该可以像这样使用它:
delete_module('psyco')
或
delete_module('psyco', ['Psycho', 'KillerError'])
# only delete these symbols from every other module
# (for "from psyco import Psycho, KillerError" statements)
-Arcege