pythonダイナミックロードモジュール(reload)

1760 ワード

サーバが構成モジュールを変更する、サーバを再起動できない場合にはreloadを再ロードし、ホットアップデートを実現することができる.
chglog:2013-10-16新しい関数setattrが実現できることを発見しました.dict__では、メンバーが存在するかどうかを判断する必要はありません.1*行にsetattr(module,loadtime,0)を設定し、2*行にsetattr(module,loadtime,mod_time)を設定します.注意:getattrは属性を取得できます.
# -*- coding: utf-8 -*-

#    
#       ,  reload                        

import time
import sys, os

def auto_reload():
    mods = ["my_config"] # the need reload modules

    for mod in mods:
        try:
            module = sys.modules[mod]
        except:
            continue

        filename = module.__file__
        # .pyc       ,     .pyc,    .py     ,            .
        if filename.endswith(".pyc"):
            filename = filename.replace(".pyc", ".py")
        mod_time = os.path.getmtime(filename)
        if not "loadtime" in module.__dict__:
            module.loadtime = 0 # first load's time  1*

        try:
            if mod_time > module.loadtime:
                reload(module)
        except:
            pass

        module.loadtime = mod_time # 2*


if __name__ == "__main__":
    import time
    import my_config
    tmp = None
    """    
    """
    while True:
        auto_reload()
        if my_config.ip != tmp:
            print my_config.ip
        tmp = my_config.ip
        time.sleep(2)
my_config.pyは簡単で、グローバル変数ipが1つしかありません
ip = "192.168.6.231"

変更my_config.pyのipグローバル変数にmy_が見つかりますconfig.ipは動的に変化します