Python 配置文件加载且自动更新(watchdog)

安装依赖:pip install watchdog 

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import logging
import os
import threading
from configparser import ConfigParser, NoOptionError
from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer

lock = threading.Lock()


class ConfigFileModifyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if os.path.relpath(event.src_path) == 'app.config':
            Config.get_instance().load_config()


class Config(object):
    __instance = None

    def __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()

    @staticmethod
    def get_instance():
        if Config.__instance:
            return Config.__instance
        try:
            lock.acquire()
            if not Config.__instance:
                Config.__instance = Config()
        finally:
            lock.release()
        return Config.__instance

    def load_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:
            return default
        section = map_key[0]
        if not self.config.has_section(section):
            return default
        option = '.'.join(map_key[1:])
        try:
            return self.config.get(section, option)
        except NoOptionError:
            return default


def get(key, default=None):
    """
    获取配置
    :param str key: 格式 [section].[key] 如:app.name
    :param Any default: 默认值
    :return:
    """
    return Config.get_instance().get(key, default)

 

posted @ 2017-09-01 20:13  stone_wl  阅读(5355)  评论(0编辑  收藏  举报