1. 程式人生 > >python的動態載入的一個注意地方

python的動態載入的一個注意地方

先描述一下我的問題背景,然後給出錯誤發現,最終給出解決辦法

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

問題解決!