pythonダイナミックロードモジュール(reload)
サーバが構成モジュールを変更する、サーバを再起動できない場合にはreloadを再ロードし、ホットアップデートを実現することができる.
chglog:2013-10-16新しい関数setattrが実現できることを発見しました.dict__では、メンバーが存在するかどうかを判断する必要はありません.1*行にsetattr(module,loadtime,0)を設定し、2*行にsetattr(module,loadtime,mod_time)を設定します.注意:getattrは属性を取得できます.
変更my_config.pyのipグローバル変数にmy_が見つかりますconfig.ipは動的に変化します
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は動的に変化します