提起Python的的配置文件,估计你去问10个人,每个人给你的答案多多少少都不一样,原因就是轮子太多了,并没有一个足够好到让大家普遍都接收的,所以在不适合场景的情况下,造轮子, 今天跟大家聊聊常用的集中配置方式。
configpare算是老牌的配置文件选择之一了,优点是标准库,不需要安装,但是需要注意的一点是,在Python2和Python3上使用方式略有差异
标准库,Python2上和Python3上包名称有差异 不需要额外安装模块算是优点之一
python2文档[1]
>>> 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文档[2]
>>> 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'
>>>
随着yaml文件的普及,不少项目开始把自己的配置文件换成了yaml文件格式
非标准库,需要单独安装,另外需要注意的是,yaml编写格式对齐有要求,一定要特别注意,常见的使用的有gitlab-ci的配置文件,k8s的配置文件等,还是比较普及的。
pyyaml[3]
pip install pyyaml
>>> 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)]'
>>>
>>> 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)]'
>>>
说到yaml, 不得不说的那就是json,其实这个应该是写在yaml之前的,但是我个人觉得,这个可读性确实有点差,编辑的时候经常会出问题,所以就放在了后面
标准库,无需单独安装,编辑的时候需要特别注意,避免语法错误
大家在看别人的代码的时候,可能会看到simplejson这个库,原因有几个:
•json是在python2.6的时候引入的,simplejson可以兼容更低版本的Python•simplejson比json块,最快的是cjson
json模块对比扩展阅读,文档很老了[4]
在线校验json[5]
simplejson[6]
>>> 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)]'
>>>
>>> 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
>>>
这个是我用的最多的,也是比较喜欢的一个模块,足够简单,配置就是键值对。
非标准库,需要单独安装,不过支持比较广,对应的Flask, Django都有对应的包,仓库的地址
python-dotenv对应github仓库[7]
pip install python-dotenv
>>> 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)]'
>>>
>>> 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)]'
>>>
有的时候为了简单,或者说是省事,就把需要的常量定义到一个文件里,使用起来直接导入对应的包即可
>>> 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)]'
>>>
>>> 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)]'
>>>
工程化的时候,是需要区分环境的,不同的环境连接DB和中间件的地址或部分常量是有所差异的,这个时候就需要以环境区分来进行加载操作,一般是在入口文件里定义一个变量,启动时去读取这个变量,如果存在就按照指定环境的配置启动,如果没有显示定义,就按默认配置启动。
更多内容可以参考李辉大大的文档[8]
# 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
}
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
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有