10.6 重新加載模塊

2018-02-24 15:27 更新

問題

你想重新加載已經(jīng)加載的模塊,因為你對其源碼進行了修改。

解決方案

使用imp.reload()來重新加載先前加載的模塊。舉個例子:

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

討論

重新加載模塊在開發(fā)和調(diào)試過程中常常很有用。但在生產(chǎn)環(huán)境中的代碼使用會不安全,因為它并不總是像您期望的那樣工作。

reload()擦除了模塊底層字典的內(nèi)容,并通過重新執(zhí)行模塊的源代碼來刷新它。模塊對象本身的身份保持不變。因此,該操作在程序中所有已經(jīng)被導(dǎo)入了的地方更新了模塊。

盡管如此,reload()沒有更新像”from module import name”這樣使用import語句導(dǎo)入的定義。舉個例子:

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

def grok():
    print('grok')

現(xiàn)在啟動交互式會話:

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

不退出Python修改spam.py的源碼,將grok()函數(shù)改成這樣:

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

現(xiàn)在回到交互式會話,重新加載模塊,嘗試下這個實驗:

>>> 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()函數(shù)被加載。通常來說,這不是你想要的,而是令人頭疼的事。

因此,在生產(chǎn)環(huán)境中可能需要避免重新加載模塊。在交互環(huán)境下調(diào)試,解釋程序并試圖弄懂它。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號