前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >网罗几种中Python配置文件方式,总有一款适合你

网罗几种中Python配置文件方式,总有一款适合你

作者头像
追马
发布2020-07-06 16:42:13
1.4K0
发布2020-07-06 16:42:13
举报
文章被收录于专栏:一日一工具一日一工具

网罗几种中Python配置文件方式,总有一款适合你

提起Python的的配置文件,估计你去问10个人,每个人给你的答案多多少少都不一样,原因就是轮子太多了,并没有一个足够好到让大家普遍都接收的,所以在不适合场景的情况下,造轮子, 今天跟大家聊聊常用的集中配置方式。

configparser or ConfigParser

configparser or ConfigParser

configpare算是老牌的配置文件选择之一了,优点是标准库,不需要安装,但是需要注意的一点是,在Python2和Python3上使用方式略有差异

是否是标准库

标准库,Python2上和Python3上包名称有差异 不需要额外安装模块算是优点之一

python2中包名称首字母大写

python2文档[1]

代码语言:javascript
复制
>>> import sys
>>> sys.version
'2.7.10 (default, Feb 22 2019, 21:55:15) \n[GCC 4.2.1 Compatible Apple LLVM 10.0.1 (clang-1001.0.37.14)]'
>>>
>>>
>>> import ConfigParser
>>> config = ConfigParser.ConfigParser()
>>> config.readfp(open('example.ini'))

>>> config.get('topsecret.server.com', 'Port')
'50022'
>>>
>>> config.get('topsecret.server.com', 'ForwardX11')
'no'
>>>
python3中包名称首字母小写

python3文档[2]

代码语言:javascript
复制
>>> import sys
>>> sys.version
'3.7.2 (default, Feb 24 2020, 13:04:30) \n[Clang 10.0.1 (clang-1001.0.46.4)]'
>>>
>>>
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.readfp(open('example.ini'))
/Users/admin/.pyenv/versions/3.7.2/bin/bpython:1: DeprecationWarning: This method will be removed in future ver
sions.  Use 'parser.read_file()' instead.
  #!/Users/admin/.pyenv/versions/3.7.2/Python.framework/Versions/3.7/bin/python
>>>
>>> config.get('topsecret.server.com', 'Port')
'50022'
>>>

pyyaml

随着yaml文件的普及,不少项目开始把自己的配置文件换成了yaml文件格式

是否是标准库

非标准库,需要单独安装,另外需要注意的是,yaml编写格式对齐有要求,一定要特别注意,常见的使用的有gitlab-ci的配置文件,k8s的配置文件等,还是比较普及的。

pyyaml[3]

安装

代码语言:javascript
复制
pip install pyyaml

演示

python2
代码语言:javascript
复制
>>> import yaml
>>>
>>>
>>> config = yaml.safe_load(open('example.yaml'))
>>> config
{'name': 'zhuima', 'address': 'beijing'}
>>>
>>>
>>> import sys
>>> sys.version
'2.7.10 (default, Feb 22 2019, 21:55:15) \n[GCC 4.2.1 Compatible Apple LLVM 1
0.0.1 (clang-1001.0.37.14)]'
>>>
python3
代码语言:javascript
复制
>>> import yaml
>>> config = yaml.safe_load(open('example.yaml'))
>>> config
{'name': 'zhuima', 'address': 'beijing'}
>>>
>>> import sys
>>> sys.version
'3.7.2 (default, Feb 24 2020, 13:04:30) \n[Clang 10.0.1 (clang-1001.0.46.4)]'
>>>

json

说到yaml, 不得不说的那就是json,其实这个应该是写在yaml之前的,但是我个人觉得,这个可读性确实有点差,编辑的时候经常会出问题,所以就放在了后面

是否是标准库

标准库,无需单独安装,编辑的时候需要特别注意,避免语法错误

大家在看别人的代码的时候,可能会看到simplejson这个库,原因有几个:

•json是在python2.6的时候引入的,simplejson可以兼容更低版本的Python•simplejson比json块,最快的是cjson

json模块对比扩展阅读,文档很老了[4]

辅助工具

在线校验json[5]

simplejson[6]

演示

代码语言:javascript
复制
>>> import json
>>>
>>> with open('example.json') as fp:
...     data = json.load(fp)
...
...
>>> 
>>> data
{u'name': u'zhuima', u'address': u'beijing'}
>>> data.get('name')
u'zhuima'
>>>
>>> sys.version
'2.7.10 (default, Feb 22 2019, 21:55:15) \n[GCC 4.2.1 Compatible Apple LLVM 1
0.0.1 (clang-1001.0.37.14)]'
>>>

python3

代码语言:javascript
复制
>>> import json
>>>
>>>
>>> with open('example.json') as fp:
...     data = json.load(fp)
...
...
>>> data
{'name': 'zhuima', 'address': 'beijing'}
>>> data.get('address')
'beijing'
>>> import sys
>>>
>>> sys.version
'3.7.2 (default, Feb 24 2020, 13:04:30) \n[Clang 10.0.1 (clang-1001.0.46.4
>>> from dotenv import load_dotenv
>>>

python-dotenv

这个是我用的最多的,也是比较喜欢的一个模块,足够简单,配置就是键值对。

是否是标准库

非标准库,需要单独安装,不过支持比较广,对应的Flask, Django都有对应的包,仓库的地址

python-dotenv对应github仓库[7]

安装

代码语言:javascript
复制
pip install python-dotenv

演示

python2
代码语言:javascript
复制
>>> from dotenv import load_dotenv
>>> import os
>>>
>>>
>>> ROOT = os.path.join(os.path.dirname('__file__'), '.')
>>>
>>> dotenv_path = os.path.join(ROOT, '.env')
>>>
>>>
>>> load_dotenv(dotenv_path)
True
>>>
>>> os.getenv('name')
'zhuima'
>>> os.getenv('address')
'beijing'
>>>
>>>
>>> import sys
>>> sys.version
'2.7.10 (default, Feb 22 2019, 21:55:15) \n[GCC 4.2.1 Comp
atible Apple LLVM 10.0.1 (clang-1001.0.37.14)]'
>>>

python3

代码语言:javascript
复制
>>> from dotenv import load_dotenv
>>>
>>>
>>> import os, pathlib
>>>
>>> dotenv_path = pathlib.Path('.') / '.env'
>>> dotenv_path
PosixPath('.env')
>>> load_dotenv(dotenv_path
...
... )
True
>>>
>>> os.getenv('name')
'zhuima'
>>>
>>> os.getenv('address')
'beijing'
>>>
>>> import sys
>>> sys.version
'3.7.2 (default, Feb 24 2020, 13:04:30) \n[Clang 10.0.1 (clang-1001.0.46.4)]'
>>>

纯py文件(常量)

有的时候为了简单,或者说是省事,就把需要的常量定义到一个文件里,使用起来直接导入对应的包即可

演示

python2
代码语言:javascript
复制
>>> import example_consts
>>> example_consts.ADDRESS
'beijing'
>>>
>>> example_consts.NAME
'zhuima'
>>>
>>> import sys
>>> sys.version
'2.7.10 (default, Feb 22 2019, 21:55:15) \n[GCC 4.2.1 Comp
atible Apple LLVM 10.0.1 (clang-1001.0.37.14)]'
>>>
python3
代码语言:javascript
复制
>>> import example_consts
>>> example_consts.ADDRESS
'beijing'
>>>
>>>
>>> example_consts.NAME
'zhuima'
>>>
>>>
>>> import sys
>>> sys.version
'3.7.2 (default, Feb 24 2020, 13:04:30) \n[Clang 10.0.1 (clang-1001.0.46.4)]'
>>>

类Django配置

工程化的时候,是需要区分环境的,不同的环境连接DB和中间件的地址或部分常量是有所差异的,这个时候就需要以环境区分来进行加载操作,一般是在入口文件里定义一个变量,启动时去读取这个变量,如果存在就按照指定环境的配置启动,如果没有显示定义,就按默认配置启动。

更多内容可以参考李辉大大的文档[8]

演示

定义配置文件
代码语言:javascript
复制
# vim configmap.py

class Config():   
   AUTHOR='zhuima'

class DevelopmentConfig(Config):
   DEBUG = True
   SQL_URI='url'

class TestConfig(Config):
   SQL_URI='url'


class ProductionConfig(Config):
   SQL_URI='url'


config ={ 
   'dev':DevelopmentConfig,
   'test':TestConfig,
   'product':ProductionConfig,
   'default':DevelopmentConfig
}
引用配置文件
代码语言:javascript
复制
from configmap import *

## 方式一
app.config.from_object(ProductionConfig)

## 方式二

app.config.from_object(config['product'])

总结

真的,写文档的时候真的是很难开头,因为甭管怎么写,都会被喷的,这方面的轮子实在是太多太多了,就不再一一演示了,有些场景下,但凡用着不爽,一个新的轮子就出来了,但是很多时候真的是不存在普适性,有大佬感兴趣的话,可以来一发,哈哈。

引用链接

[1] python2文档: https://docs.python.org/2/library/configparser.html [2] python3文档: https://docs.python.org/3/library/configparser.html [3] pyyaml: https://pyyaml.org/wiki/PyYAMLDocumentation [4] json模块对比扩展阅读,文档很老了: http://web.archive.org/web/20100814143114/http://deron.meranda.us/python/comparing_json_modules/ [5] 在线校验json: http://json.cn/ [6] simplejson: https://simplejson.readthedocs.io/en/latest/ [7] python-dotenv对应github仓库: https://github.com/theskumar/python-dotenv [8] 更多内容可以参考李辉大大的文档: https://zhuanlan.zhihu.com/p/24055329

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 链上追马 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 网罗几种中Python配置文件方式,总有一款适合你
    • configparser or ConfigParser
      • configparser or ConfigParser
      • 是否是标准库
    • pyyaml
      • 是否是标准库
      • 安装
      • 演示
    • json
      • 是否是标准库
      • 辅助工具
      • 演示
      • python3
    • python-dotenv
      • 是否是标准库
      • 安装
      • 演示
      • python3
    • 纯py文件(常量)
      • 演示
    • 类Django配置
      • 演示
    • 总结
    相关产品与服务
    消息队列 TDMQ
    消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档