关于如何配置一个Python程序,如果你还停留在使用ini,json,yaml,xml等文件格式之争,或者还在为使用哪个库来加载配置纠结,只能说明你还没有开发过一个严肃认真的大型Python应用程序。

关于Python程序读取配置,一个严肃认真的大型程序,真正面临的问题其实是这些:不小心写错了一个配置项,却没有语法检查工具来帮助检查,直到程序崩溃,才发现是配置项写错了。

部署时要在不同的机器间不断地copy/paste配置文件,而且还要逐一修改。比如开发完成后,测试人员要拿着开发给的配置文件,在测试机器上按照测试环境进行修改,运维人员在部署时,也需要修改配置文件,而“修改”这个动作又是无法被测试覆盖的。

账号和口令写在配置文件中,有可能在分享源文件的过程中泄漏出去。特别是在项目是开源的、或者未来可能开源的情况下。

搭建新工程时,要把时间花在配置诸如logging, database, caceh, message queue这些服务上,而不是真正有效的业务逻辑上。

服务是由许多台负载均衡的服务器来完成的。如果使用文件型的配置,在修改配置时,就需要登录到这些机器上逐一修改;如果使用数据库来进行中心化配置,但有时为了故障排除或者其它原因,又需要对某几台机器进行小量的配置修改。

更改配置必须重启服务程序,从而使得服务中断。

现在, cfg4py为上述问题提供了一个完整的解决方案。

cfg4py是一个层次化(cascading design)、部署环境自适应(Adaptive deployment)的配置系统。 它支持配置中心化,但又能通过本地文件覆盖全局配置;为不同的环境(开发、测试和生产环境)准备了不同的配置文件,相同的配置项提取在defaults.yaml中,使得部署过程中几乎无须修改。

它还提供了模板功能,可以供在项目创建之初,快速配置各种服务和日志模块。

它通过将yaml文件中的配置项编译成为Python class,从而使得你可以享受到代码自动补全的便捷,代码重构也成为可能:现在你可以象重命名普通变量一样来重命名一个配置项了!

此外,它还提供了环境变量宏,使用cfg4py,你只需要在配置文件中引用定义账号、密码的环境变量,程序就能最终获得这些信息,而无须在源码和配置文件中暴露这些秘密。

模板

当你新建一个Python工程时,你可以在安装了cfg4py的环境下,运行 python scaffold命令,按照提示将对应的配置项加入你的工程中:

Auto-complete (自动补全)

当你写好配置后,在命令行下运行cfg4py build,这样就会生成一个名为cfg4py_auto_gen.py的文件,将它导入到工程中,就可以使用代码自动提示了:

当然,每次新增或者修改了配置文件时,都需要做一次build。如果你需要对配置文件进行重构,现在变得很简单,因为所有的配置项目都变成了对象的一个属性,所以,如果你在开发过程中,突然觉得某个配置项的名称不顺口,没关系,象重命名一个普通变量一样来重构它,所以引用这个配置项的地方,都将自动更新!

使用宏来读取环境变量

使用宏来读取环境变量有两个用处,一是不在任何文件中配置账号和密码。二是你也可以将因机器差异,而需要进行不同配置的项放进环境变量,从而使得配置文件在不同的机器上完全一致,无需修改。这样会减少很多部署的工作,避免一些错误。

比如,你申请了一个第三方的服务账号,需要配置在程序中,你当然不希望将账号和密码泄露出去。现在,你可以机器上定义环境变量:

export vendor_account=my_account

export vendor_password=my_password

然后在你的配置文件中引用它们:

# in your configuration file, for example: defaults.yamlthird_party_service:account:${vendor_account}password:${password}# this is how you could access these secrets:cfg = cfg4py.init(...)print(cfg.third_party_service.account, cfg.thired_party_service.password)

甚至开发团队之间都不应该共享这些账号。现在,这些账号都配置为本机的环境变量,从而避免了泄漏。

Cascading design (多层设计)

cfg4py允许你通过远程的中央数据源来统一进行配置。

如果这个中央数据源是redis,那么只要指定redis连接和配置项的键值,cfg4py将自动为你加载这些配置(按照你指定的refresh period)。注意cfg4py只支持yaml格式,所以即使这些配置不是写在文件中,而是在cache中,它们也应该是yaml格式。

如果中央数据源是其它类型的数据库,则你需要自己实现一个RemoteConfigFetcher, 并实现它的fetcher接口。

class MyConfigFetcher(RemoteConfigFetcher):

def __init__(self, *arg, **kwargs):

def fetch(self) -> str:

# fetch settings from database, decode as string, and return

pass

然后调用config_remote_fetcher,让cfg4py加载这个fetcher:

fetcher = MyConfigFetcher()

cfg4py.config_remote_fetcher(fetcher, interval = 500)

在上述例子中,cfg4py每5分钟会从中央数据源更新一次配置。 如果个别机器需要有自己的配置,则只需要在本地写一个配置文件,改写部分配置即可。cfg4py会自动完成配置的合并和改写。

Adaptive deployment (部署环境自适应)

一个典型的cfg4py配置文件系统共有4个配置文件: 1. defaults.yaml 2. dev.yaml 3. test.yaml 4. production.yaml

通过cfg4py scaffold命令初始化后,你的工程中就会出现这些文件。然后你需要配置当前机器的角色环境变量:

export __cfg4py_server_role__=DEV

这个变量名很长,不容易记忆。但是你可以在控制台下通过cfg4py set-server-role来查看帮助,这个命令会显示跟上面一样的提示。

如果这个命令也太长,不容易记忆?你只要记住cfg4py就好,cfg4py提供了命令行提示,连续敲两个tab,就会提示你所有的命令:

其它功能

更新配置是热更新。如果配置是从本地文件加载的,更新将是实时更新;如果配置是远程加载的,那么由你定义的更新间隔来决定。

忘记该怎么设置pip源或者conda源?试试cfg4py hint命令吧。

这么好的模块,怎么以前没有发现它呢?不错,这是个新开发出来的库,不过质量应该到了可以使用的阶段了,测试覆盖率也达到了94%。

python的cfg是什么模块_cfg4py:一个严肃的Python配置模块应有的风格-层级式、部署环境自适应、自动补全...相关推荐

  1. 8s yaml 配置生成_cfg4py:一个严肃的Python配置模块应有的风格-层级式、部署环境自适应、自动补全...

    关于如何配置一个Python程序,如果你还停留在使用ini,json,yaml,xml等文件格式之争,或者还在为使用哪个库来加载配置纠结,只能说明你还没有开发过一个严肃认真的大型Python应用程序. ...

  2. python自动开发环境_Python2.7.12开发环境构建(自动补全)

    一.安装readline-devel包 Python的编译安装依赖于这个包 yum -y install readline-devel 二.安装Python2.7.12 # tar xf Python ...

  3. python jupyter notebook怎么调字体大小_配置Jupyter的代码主题 字体以及字体大小 代码自动补全...

    jupyter默认没有代码提示,字体非常的难看,特别是引号,一直想更换字体和主题,就把方法整理了一下.如果你单独想更换字体的话,需要修改浏览器的字体,这个是受浏览器的影响. 如果想更换主题往下看,代码 ...

  4. python shell怎么调字体_Python3设置在shell脚本中自动补全功能的方法

    本篇博客将会简短的介绍,如何在ubuntu中设置python自动补全功能. 需求:由于python中的内建函数较多,我们在百纳乘时,可能记不清函数的名字,同时自动补全功能,加快了我们开发的效率. 方法 ...

  5. python生成shell脚本_Python设置在shell脚本中自动补全功能的方法

    本篇博客将会简短的介绍,如何在ubuntu中设置python自动补全功能. 需求:由于python中的内建函数较多,我们在百纳乘时,可能记不清函数的名字,同时自动补全功能,加快了我们开发的效率. 方法 ...

  6. python怎么运行yaml配置文件_cfg4py:一个严肃的Python配置模块应有的风格

    关于如何配置一个Python程序,如果你还停留在使用ini,json,yaml,xml等文件格式之争,或者还在为使用哪个库来加载配置纠结,只能说明你还没有开发过一个严肃认真的大型Python应用程序. ...

  7. python readline_python安装readline模块 实现自动补全

    yum安装readline.readline-devel #yum install -y readline-devel 下载安装setuptools #wget http://pypi.python. ...

  8. python自动补全库_叼炸天的库! 自动补全 Python 代码,能节省 60% 敲码时间

    近日,Reddit 上的一篇帖子引起了网友的热议.帖子作者「mlvpj」称: 「我们使用深度学习完成了一个简单的项目,可以自动进行 Python 代码补全.」 根据介绍,该项目基于 LSTM 模型,训 ...

  9. 这个库厉害了,自动补全Python代码,节省50%敲码时间

    点击"小詹学Python",选择"星标"公众号 第一时间速享重磅干货 本文转自 机器之心,禁止二次转载 摘要:介绍一个优秀代码自动补全工具库. 近日,Reddi ...

最新文章

  1. [感动]看来的故事:小孩和鱼
  2. python for loop步进值_python-对for循环的结果进行排序时保持值连...
  3. 使用握手信号实现跨时钟域数据传输
  4. html控制按钮里面的文字,有谁可以告诉我web网页制作中通过三个按钮控制页面上的一段文字放? 爱问知识人...
  5. oracle存储返回sql查询,如何做才能使record类型和table类型存储查询语句返回的多条记录?...
  6. web表单设计:点石成金_如何设计安全的Web表单:验证,清理和控制
  7. mysql慢查询分析工具和分析方法
  8. 嫦娥四号生物科普载荷内长出月球第一片植物嫩芽
  9. 【秋招总结】分享我的社招java岗经验,以及我的大厂offer比较(京东网易滴滴,天津农行软开)
  10. 自动驾驶中ROS操作系统的重要性
  11. 用谷歌浏览器下载网页视频
  12. 电子签章服务器位置的确定,一文看懂如何实现服务端电子签章
  13. 2019黑马python吾爱_最新Python黑马头条推荐系统项目视频教程
  14. 【BDTC 2016】交通与旅游大数据论坛:透过大数据看交通
  15. java ee 7精粹_Java EE 7精粹 ([美]Arun Gupta) 中文pdf扫描版[68MB]
  16. 百度网盘在线不限速下载网站源码
  17. 建筑垃圾运输车辆监管系统,渣土车管理实施方案,
  18. PIV流场流速矢量图、流线图(MATLAB quiver函数的用法)
  19. php的两种安装方式,PHP的安装方法
  20. 根据hash值找到bt种子的磁力下载链…

热门文章

  1. 如何看待矿池抽税激励社区开发者?如何看待EOS?——BCH极客大赛江卓尔专访
  2. module r8169
  3. SQL Server清空日志以及查看日志大小语句
  4. 勒索病毒爆发,WFilter教你如何应对?
  5. 什么是AWS Lambda?——事件驱动的函数执行环境
  6. Windows下使用explorer批量下载文件
  7. graylog - collecting Failed and Accepted logins for your SSH
  8. checkbox管理
  9. javascript中的字典
  10. 资深首席架构师眼中的架构应该是怎样的?【转】