分享

python动态加载模块(reload)

 天才白痴书馆 2015-04-16
有时候服务器修改了配置模块,而又不能够重启服务器的情况下,可以reload来重新加载,实现热更新.

chglog:2013-10-16 发现了一个新函数 setattr可以实现__dict__那段,不需要判断是否存在该成员:在1*行setattr(module, loadtime, 0)然后在2*行setattr(module, loadtime, mod_time)
注:getattr可以取属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# -*- 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会动态改变  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多