10.6 �新加载模�¶

问题¶

你想�新加载已�加载的模�,因为你对其��进行了修改。

解决方案¶

使用imp.reload()��新加载先�加载的模�。举个例�:

>>> import spam
>>> import imp
>>> imp.reload(spam)
<module 'spam' from './spam.py'>
>>>

讨论¶

�新加载模�在开�和调试过程中常常很有用。但在生产环境中的代�使用会�安全,因为它并�总是�您期望的那样工作。

reload()擦除了模�底层字典的内容,并通过�新执行模�的�代��刷新它。模�对象本身的身份����。因此,该�作在程�中所有已�被导入了的地方更新了模�。

尽管如此,reload()没有更新��from module import name�这样使用import语�导入的定义。举个例�:

# spam.py
def bar():
    print('bar')

def grok():
    print('grok')

现在�动交互�会�:

>>> import spam
>>> from spam import grok
>>> spam.bar()
bar
>>> grok()
grok
>>>

�退出Python修改spam.py的��,将grok()函数改�这样:

def grok():
    print('New grok')

现在回到交互�会�,�新加载模�,�试下这个实验:

>>> import imp
>>> imp.reload(spam)
<module 'spam' from './spam.py'>
>>> spam.bar()
bar
>>> grok() # Notice old output
grok
>>> spam.grok() # Notice new output
New grok
>>>

在这个例�中,你看到有2个版本的grok()函数被加载。通常�说,这�是你想�的,而是令人头疼的事。

因此,在生产环境中�能需����新加载模�。在交互环境下调试,解释程�并试图弄懂它。