openstack通用库Oslo之config

    xiaoxiao2021-03-25  104

    oslo config库用于解析命令行和配置文件中的配置(config)选项(opts)。

    其中有组(group)的概念,可以理解为就是ini风格文件中的【section】,比如下图中的DEFAULT和db_backend,以及rpc_backend:

    [DEFAULT] log_dir=/var/log/xxx log_file=yyyy.log ... [db_backend] ... [rpc_backend] rabbitmq_host=... ...

    注意点

    老版本中,oslo config包的引入方式是:

    from oslo.config import cfg from oslo.config import types ...

    而在新版本中,包名发生了改变:

    from oslo_config import cfg from oslo_config import types ...

    oslo是如何查找配置文件的位置的?

    书上说,是按照如下的顺序查找配置文件:

    ~/.xyz/xyz.conf ~/xyz.conf /etc/xyz/xyz.conf /etc/xyz.conf

    核心的查找配置文件所在目录的源码如下:

    def _pre_setup(self, project, prog, version, usage, default_config_files, default_config_dirs): """Initialize a ConfigCliParser object for option parsing.""" if prog is None: prog = os.path.basename(sys.argv[0]) if prog.endswith(".py"): prog = prog[:-3] if default_config_files is None: default_config_files = find_config_files(project, prog) if default_config_dirs is None: default_config_dirs = find_config_dirs(project, prog) self._oparser = _CachedArgumentParser(prog=prog, usage=usage) if version is not None: self._oparser.add_parser_argument(self._oparser, '--version', action='version', version=version) return prog, default_config_files, default_config_dirs

    首先获取当前执行主脚本的名字,即prog参数

    def _find_config_files(project, prog, extension): if prog is None: prog = os.path.basename(sys.argv[0]) if prog.endswith(".py"): prog = prog[:-3] cfg_dirs = _get_config_dirs(project) config_files = (_search_dirs(cfg_dirs, p, extension) for p in [project, prog] if p) return [x for x in config_files if x]

    然后根据项目名称生成多个可能存在的目录路径:

    def _get_config_dirs(project=None): ##project就是我们包的名字 """Return a list of directories where config files may be located. :param project: an optional project name If a project is specified, following directories are returned:: ~/.${project}/ ~/ /etc/${project}/ /etc/ Otherwise, these directories:: ~/ /etc/ """ cfg_dirs = [ _fixpath(os.path.join('~', '.' + project)) if project else None, _fixpath('~'), os.path.join('/etc', project) if project else None, '/etc' ] return [x for x in cfg_dirs if x]

    由于cfg.CONF对象,在被调用的时候,执行__call__方法:

    def __call__(self, args=None, project=None, prog=None, version=None, usage=None, default_config_files=None, default_config_dirs=None, validate_default_values=False):

    因此,如果我们想自定义配置文件的路径,但是只给定配置文件的名字–即default_config_files,是不够的,还得给定default_config_dirs,除非你把配置文件放置到上述的几个搜索路径中。

    CONF = cfg.CONF CONF.register_group(xxxx) CONF.register_opts(yyyy, xxxx) if __name__ == "__main__": import pdb;pdb.set_trace() CONF(default_config_files=['app.conf', #可以有多个配置文件地址 ], default_config_dirs=os.path.split(os.path.realpath(__file__))[0])
    转载请注明原文地址: https://ju.6miu.com/read-18642.html

    最新回复(0)