重新加載Python模塊 -reload的應用


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()fromimport

如果一個模塊實例化了一個類的實例,重新加載定義該類的模塊不會影響實例的方法定義——它們繼續使用舊的類定義。對於派生類也是如此。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM