python应用程序的配置管理器
cfitall的Python项目详细描述
cfitall(configure it all)是 python应用程序。它的灵感来源于 优秀的viper图书馆, 尽管它还没有那么多功能。
它确实涵盖了从组合中配置应用程序的基础知识 具有可预测的继承层次结构。它通过 为应用程序创建配置注册表,合并来自 以下源检索请求的值:
- 开发人员提供的默认值
- yaml或json配置文件(值覆盖默认值)
- 环境变量(覆盖配置文件值和默认值)
- set()开发人员进行的调用(覆盖所有内容)
(对命令行和k/v存储数据源的支持是为将来准备的; 欢迎提出请求。)
安装
pip install cfitall应该对大多数用户起作用。财阀 需要python3,但其他方面的依赖性很小。
要为debian/ubuntu构建一个包,stdeb 工作良好:
apt install python3-all python3-stdeb python3-pbr setup.py --command-packages=stdeb.command sdist_dsc --debian-version bionic1 bdist_deb
示例
这个例子是针对一个名为myapp的人工应用程序。
首先,为myapp设置一个config模块。注意我们的名字 配置对象myapp。
# myapp/config.py from cfitall.config import ConfigManager # create a configuration registry for myapp config = ConfigManager('myapp') # set some default configuration values config.set_default('global.name', 'my fancy application') config.values['defaults']['global']['foo'] = 'bar' config.set_default('network.listen', '127.0.0.1') # add a path to search for configuration files config.add_config_path('/Users/wryfi/.config/myapp') # read data from first config file found (myapp.json, myapp.yaml, or myapp.yml) config.read_config()
因为我们命名了配置对象myapp,所以环境变量 以MYAPP__开头的值由cfitall搜索。 包含逗号的环境变量解释为 逗号分隔的列表。导出一些环境变量以在中查看 操作:
export MYAPP__GLOBAL__NAME="my app from bash" export MYAPP__GLOBAL__THINGS="four,five,six" export MYAPP__NETWORK__PORT=8080
同样,因为我们选择了myapp作为配置对象名,所以 配置文件也被命名为myapp.(json|yaml|yml)。创建 使用yaml或json格式的配置文件,并将其放在 已添加到配置注册表:
# ~/.config/myapp/myapp.yml global: bar: foo things: - one - two - three person: name: joe hair: brown network: port: 9000 listen: '*'
现在您可以使用config对象来获取 需要。您可以通过其配置访问合并的配置数据 键(点路径表示法),或者您可以获取整个合并的 通过dict属性的字典。
# myapp/logic.py from config import config # prints $MYAPP__GLOBAL__THINGS because env var overrides config file print(config.get('global.things', list)) # prints $MYAPP__NETWORK__PORT because env var overrides config file print(config.get('network.port', int)) # prints '*' from myapp.yml because config file overrides default print(config.get('network.listen', str)) # prints 'joe' from myapp.yml because it is only defined there print(config.get('global.person.name', str)) # alternate way to print joe through the config dict property print(config.dict['global']['person']['name']) # prints the entire assembled config as dictionary print(config.dict)
运行logic.py应该像这样:
$ python logic.py ['four', 'five', 'six'] 8080 * joe joe {'global': {'name': 'my app from bash', 'foo': 'bar', 'bar': 'foo', 'things': ['four', 'five', 'six'], 'person': {'name': 'joe', 'hair': 'brown'}}, 'network': {'listen': '*', 'port': '8080'}}
注释
- 避免在配置变量中使用__(双下划线)
键(名称),当
正在分析环境变量。
- 如果必须在变量键中使用__,则可以传递 env_separator参数的字符串与 配置管理器构造函数,例如 config = ConfigManager(env_separator='____')。
- 与模式匹配的环境变量MYAPP__.*是
自动读入配置,其中MYAPP引用
创建时给configmanager的大写name。
- 可以通过传递env_prefix值自定义此行为 和/或env_separator作为配置管理器构造函数的Kwargs。
开发
cfitall使用现代python工具和pipenv依赖项/环境 经理和PBR包装系统。