问题现象:
编写一套python程序使用自动载入功能,python主程序放置后台运行,我们经常遇到修改了子模块需要重启主程序,特别是修改一个小功能也需要重启主程序很是麻烦。
解决思路:
- 每次检测模块是否载入,如果载入考虑使用reload来重载模块
- 每次执行之后删除载入的模块,下次运行时再载入模块
- 配置模块版本文件,每次运行的时候检查版本,检测到新的版本时,可以使用1或2的方法重载模块
- 检测模块文件的更新时间,(此处存在一个文件,就是文件更新时间与当前时间相差多少作为重载的条件合适)
程序编写:
我选择的是第二种方式,没有特殊理由,也没有考虑这样产生的负载;就是觉得可以少做一次检测。理论上每次重新载入模块可能会增加服务器负担
此处以flask为例编写的模块自动载入。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os, sys, re, types
from flask import Flask
app = Flask(__name__)
@app.route( '/api/<m_name>/<m_func>', methods=['GET', 'POST'] )
def LoadModules(m_name, m_func):
try:
obj = __import__('api.'+m_name, {}, {}, m_name)
mf = getattr(obj,m_func)
if type(mf) is types.FunctionType:
result = mf()
elif type(mf) is types.ClassType:
c = mf()
d = getattr(c, m_func)
result = d()
elif type(mf) is types.InstanceType:
result = mf.m_func()
except:
result = "Your module error " + m_name
else:
del sys.modules['api.'+m_name]
del m_name
finally:
return result
if __name__ == '__main__':
app.run('0.0.0.0', '8888')