#!/usr/bin/env python3#-*- coding: utf-8 -*-
importloggingimportosimportthreadingfrom configparser importConfigParser, NoOptionErrorfrom watchdog.events importFileSystemEventHandlerfrom watchdog.observers importObserver
lock=threading.Lock()classConfigFileModifyHandler(FileSystemEventHandler):defon_modified(self, event):if os.path.relpath(event.src_path) == ‘app.config‘:
Config.get_instance().load_config()classConfig(object):__instance =Nonedef __init__(self, config_file_path=None):
logging.debug(‘配置初始化‘)
self.config=ConfigParser()
self.config_file_path= config_file_path or os.path.join(os.path.dirname(__file__), ‘../app.config‘)
self.load_config()
self._init_config_file_observer()def_init_config_file_observer(self):
logging.debug(‘配置文件监控‘)
event_handler=ConfigFileModifyHandler()
observer=Observer()
observer.schedule(event_handler, path=os.path.dirname(self.config_file_path), recursive=False)
observer.setDaemon(True)
observer.start()
@staticmethoddefget_instance():if Config.__instance:return Config.__instance
try:
lock.acquire()if not Config.__instance:
Config.__instance =Config()finally:
lock.release()return Config.__instance
defload_config(self):
logging.debug(‘加载配置‘)
self.config.read(self.config_file_path,‘utf-8‘)def get(self, key, default=None):"""获取配置
:param str key: 格式 [section].[key] 如:app.name
:param Any default: 默认值
:return:"""map_key= key.split(‘.‘)if len(map_key) < 2:returndefault
section=map_key[0]if notself.config.has_section(section):returndefault
option= ‘.‘.join(map_key[1:])try:returnself.config.get(section, option)exceptNoOptionError:returndefaultdef get(key, default=None):"""获取配置
:param str key: 格式 [section].[key] 如:app.name
:param Any default: 默认值
:return:"""
return Config.get_instance().get(key, default)