python动态加载模块(reload)
有时候服务器修改了配置模块,而又不能够重启服务器的情况下,可以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很简单,只有一个全局变量ipip = "192.168.6.231"修改my_config.py的ip全局变量会发现my_config.ip会动态改变