python的動態載入的一個注意地方
阿新 • • 發佈:2019-02-05
先描述一下我的問題背景,然後給出錯誤發現,最終給出解決辦法
1:我有很多python檔案,並且這些檔案內容會按照一定週期被更新但是檔名字不變。並且每個檔案內都有一個一樣的class的名字,需要我去動態呼叫,我的呼叫方法是使用的python的importlib。呼叫的程式碼如下:
module_name = 'scripts.%s'%(file_name)
_module = importlib.import_module('.', module_name)
_class = getattr(_module, 'RunModel')
cls_obj = _class()
在這個問題中file_name是不會變,但是一定時間後內容會更變,但是class的名字永遠是"RunModel"。我的測試發現,不管檔案內容怎麼變,_class的id一樣。這個就是錯誤發現。
2:初步猜測是python在載入之前會看這個_module是不是已經載入額,如果載入就不在去載入。後來確認的確這樣,所以給出解決辦法就是在載入之前先判斷系統是否有這個模組,如果沒有則載入,如果有則先刪除在載入。程式碼如下:
module_name = 'scripts.%s'%(file_name) if module_name in sys.modules.keys(): self.log.info('Module:%s has been loaded, delete it'%(module_name)) del sys.modules[module_name] _module = importlib.import_module('.', module_name) else: _module = importlib.import_module('.', module_name) _class = getattr(_module, 'RunModel') cls_obj = _class()
問題解決!