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包装系统。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java搜索具有外键的JPA实体的约定是什么?   java事务没有使用事务和嵌套方法的2个实例回滚   SpringBootJavaMessageFormat。使用umlauts格式(ä/ö/ü)   java如何通过字符串在sqlite中搜索列   JAVAlang.ClassNotFoundException:org。冬眠Hibernate4的例外情况   java消息正文在Gmail中被弄乱了   java Apache Ignite未使用空值更新缓存   Java正则表达式未捕获组   java onBackPressed();除非我叫super否则不行。onBackPressed();两次密码   java CustomAlertDialog在删除数据库记录后未完成其进程   C++中的迭代器(Stl)与java,是否存在概念上的区别?   Java在不知道字符编码的情况下将字节[]转换为字符串   来自本地WSDL文件的java Web服务客户端   java工具可用于在一个位置聚合所有项目相关信息   java在Netbeans中的maven项目中设置依赖项