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)
时间: 2024-12-29 05:39:36

Python 配置文件加载且自动更新(watchdog)的相关文章

关于bash的配置文件加载

bash的配置文件分为两类全局配置 /etc/profile  /etc/profile.d/*.sh  /etc/bashrc个人配置 ~/.bash_profile  ~/.bashrc profile类的配置:设定环境变量:运行命令或脚本bashrc类的配置:设定本地变量:定义命令别名 登录式shell如何读取配置文件 (通过本地命令行或远程终端登录:su - username)/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profil

hibernate源码-配置文件加载过程分析

Hibernate建议,在一个应用系统当中Configuration与SessionFactory为单例,Session为多例. 当我们执行如下代码,hibernate开始加载默认的配置文件 new Configuration().configure() hibernate会在classath的根路径下,查找名为"hibernate.cfg.xml" 的配置文件,并解析它,过程如图1所示 图1:配置文件加载过程时序图 下面一起分析一下配置文件加载过程 Step 1.Configurat

Tomcat:自动部署、自动重加载、自动编译

麻雀虽小,五脏俱全,Tomcat 提供的自动部署.自动重加载.自动编译功能,可谓是让人又爱又恨.接下来就对这三者做一个介绍,文章中会Copy一些官方文档中的说法. If you are using the standard Host implementation, the following actions take place automatically when Catalina is first started, if the deployOnStartup property is set

springboot 容器加载后自动监听 获取access_token

问题来源: 因为在项目中需要获取微信的access_token ,access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效. 所以需要一个线程,来定时获取和更新access_token 一 新建 TokenThread 线程 package com.hm

Python动态加载模块

需求:实现一个简单的pyton程序,接收两个参数:plugin_name, data,根据不同的plugin_name定位到不同的逻辑处理模块并进行输出. 实现方案: 使用python的库函数:load_source,将插件模块加载到一个dict中key为模块名称,value为类的实例,核心代码: def load_plugins(): global plugin_dict # 遍历插件目录加载所有py结尾的模块 for root, dirs, files in os.walk(module_p

saltstack源码-启动3-config.py配置文件加载

#目标文件位置/usr/lib/python2.6/site-packages/salt/config.py#这个文件加载配置文件的模块.master和minion的配置文件加载都是在这个模块里面完成的#master的启动在这模块里面只涉及到方法和属性只有几个 master和minion的默认配置属性也在这个文件里面定义 DEFAULT_MASTER_OPTS = { 'interface': '0.0.0.0', 'publish_port': '4505', 'pub_hwm': 1000,

Java误区: 静态代码块,会在类被加载时自动执行?

JAVA静态代码块会在类被加载时自动执行? 很多Java开发者的思想,被这个思想深深的轮奸了n遍,传播这个错误思想的博客,在网上一堆,越来越多的人被轮奸. 如:http://blog.csdn.net/leeyu35/article/details/7755304 那么我们程序来证明这句话是错误的: class MyClass1 { static {//静态块 System.out.println("static block "); } } public class Main { Cl

[Eclipse] - 集成JBoss7热加载和自动发布

使用Eclipse + JBoss开发时,总是要重启项目或JBoss,烦人.下面方法可以很简单的实现Eclipse + JBoss热加载和自动发布. 我的环境是JBoss 7.1.1 Final 1) 下载这个:jboss-as-web-7.1.1.Final-RECOMPILE.jar http://files.cnblogs.com/HD/jboss-as-web-7.1.1.Final-RECOMPILE.jar.zip 2) 把这个jar包放到这个目录下:jboss-as-7.1.1.F

python学习-加载配置文件

import configparser # 实例化cp = configparser.ConfigParser() # 加载配置文件cp.read("my_config.conf",encoding="utf-8")# print(fs)# section []# option section之下的选项# 获取 所有的 sectionsprint(cp.sections()) # 获取某一个section下的选项print(cp.options("stud