2012-10-01 132 views
-1

我需要完整地在python中重新加载模块。我的意思是“完全‘的是,我不希望 以下特点(从Python 2.6文档的内置加载功能):重新加载并重置

’......如果一个模块的新版本不定义是由旧版本 定义的名称,旧的定义仍然......“。

即我不希望在新的模块版本消失要保留旧名称。

实现此目标的最佳做法是什么?

谢谢!

+0

为什么不用Ctrl + F重新启动Python Shell?您仍然可以使用ALT + P重新调用先前的命令。 – LarsVegas

+0

@larsvegas:我不在python shell中,我从我的程序动态加载代码。 – frank

+0

我想你应该看看['gc'](http://docs.python.org/library/gc.html#module-gc)模块。 – LarsVegas

回答

3

删除从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我有一种感觉,如果模块本身做一些其他的导入 - 它可能不是特别强大 - 我已经在第三方模块上做了另一个测试,并且如果你不删除它似乎不起作用它下面的任何其他模块(但嗯...) –