-
3.3 版中的新功能。
-
importlib.
reload
(模塊) -
重新加載以前導入的模塊。參數必須是一個模塊對象,所以它必須之前已經成功導入。如果您使用外部編輯器編輯了模塊源文件並希望在不離開 Python 解釋器的情況下試用新版本,這將非常有用。返回值是模塊對象(如果重新導入導致將不同的對象放入 中,則可能會有所不同
sys.modules
)。什么時候執行:
reload()
-
Python 模塊的代碼被重新編譯並重新執行模塊級代碼,通過重用最初加載模塊的加載器來定義一組新的對象,這些對象綁定到模塊字典中的名稱。
init
擴展模塊的功能不會被第二次調用。 -
與 Python 中的所有其他對象一樣,舊對象僅在其引用計數降至零后才會被回收。
-
模塊命名空間中的名稱更新為指向任何新的或更改的對象。
-
對舊對象的其他引用(例如模塊外部的名稱)不會重新引用到新對象,並且如果需要,必須在它們出現的每個命名空間中更新。
還有一些其他注意事項:
當一個模塊被重新加載時,它的字典(包含模塊的全局變量)被保留。名稱的重新定義將覆蓋舊定義,因此這通常不是問題。如果模塊的新版本未定義由舊版本定義的名稱,則舊定義保留。如果模塊維護全局表或對象緩存,則此功能可用於模塊的優勢 - 使用
try
語句可以測試表的存在並在需要時跳過其初始化:try: cache except NameError: cache = {}
重新加載內置或動態加載的模塊通常不是很有用。 刷新ING
sys
,__main__
,builtins
不建議和其他關鍵模塊。在許多情況下,擴展模塊不會被設計為多次初始化,並且在重新加載時可能會以任意方式失敗。如果一個模塊使用
from
…… 從另一個模塊導入對象import
,調用另一個模塊不會重新定義從它導入的對象——解決這個問題的一種方法是重新執行語句,另一種方法是使用 限定名稱(module.name)反而。reload()
from
import
如果一個模塊實例化了一個類的實例,重新加載定義該類的模塊不會影響實例的方法定義——它們繼續使用舊的類定義。對於派生類也是如此。
-
import os import importlib import Test import time filePrefix='Test' fileSuffix='.py' text =('import os\n' "import sys\n" "def demo():\n") for i in range(6): text1 = text +" print(" + str(i+1) + ")" filename=filePrefix+fileSuffix with open(filename,'w') as f: f.write(text1) f.closed importlib.reload(Test) time.sleep(1) Test.demo()
問題importlib.reload前需要加一定的延時(示例程序中延時不得小於1秒)
參考:https://docs.python.org/3.6/library/importlib.html?highlight=importlib%20reload#importlib.reload