重新加载并重置
问题描述:
我需要完整地在python中重新加载模块。我的意思是“完全‘的是,我不希望 以下特点(从Python 2.6文档的内置加载功能):重新加载并重置
’......如果一个模块的新版本不定义是由旧版本 定义的名称,旧的定义仍然......“。
即我不希望在新的模块版本消失要保留旧名称。
实现此目标的最佳做法是什么?
谢谢!
答
删除从sys.modules
并重新导入模块可能是一个开始,虽然我没有测试它超越了如下:
import itertools
itertools.TEST = 7
reload(itertools)
print itertools.TEST
# 7
import sys
del sys.modules['itertools']
import itertools
print itertools.TEST
#Traceback (most recent call last):
# File "/home/jon/stackoverflow/12669546-reload-with-reset.py", line 10, in <module>
# print itertools.TEST
# AttributeError: 'module' object has no attribute 'TEST'
测试与第三方模块
>>> import pandas
>>> import sys
>>> del sys.modules['pandas']
>>> import pandas
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
import pandas
File "/usr/local/lib/python2.7/dist-packages/pandas-0.7.3-py2.7-linux-x86_64.egg/pandas/__init__.py", line 10, in <module>
import pandas._tseries as lib
AttributeError: 'module' object has no attribute '_tseries'
>>> to_del = [m for m in sys.modules if m.startswith('pandas.')]
>>> for td in to_del:
del sys.modules[td]
>>> import pandas
>>> # now it works
+0
看起来不错,但这是推荐的方法吗?有什么问题吗? – frank
+0
@frank我有一种感觉,如果模块本身做一些其他的导入 - 它可能不是特别强大 - 我已经在第三方模块上做了另一个测试,并且如果你不删除它似乎不起作用它下面的任何其他模块(但嗯...) –
为什么不用Ctrl + F重新启动Python Shell?您仍然可以使用ALT + P重新调用先前的命令。 – LarsVegas
@larsvegas:我不在python shell中,我从我的程序动态加载代码。 – frank
我想你应该看看['gc'](http://docs.python.org/library/gc.html#module-gc)模块。 – LarsVegas