python配置文件读取环境变量_转载:Python项目读取配置的几种方式
1
2
3
4
5
6
7
8
9
10
11
12
import os
import configparser
try:
CONFIG_PATH= os.environ['CONFIG_PATH']
except Exception:
raise ValueError
config= configparser.ConfigParser()
config.read(CONFIG_PATH)
host= config["DATABASE"]["HOST"]
3. 直接使用系统环境变量读取配置
此方法不使用文件来存储配置信息,将所有的配置信息存储到环境变量中,在实践中也比较常见,运维通过ansible部署脚本,在程序运行前将需要配置信息导入到环境变量中。
1
2
3
4
5
6
7
8
import os
secret_key= os.environ.get('SECRET_KEY',None)
if not secret_key:
raise ValueError('You must have "SECRET_KEY" variable')
app.config['SECRET_KEY']= secert_key
不利用文件存储,在一定程度上加强了对密码等配置信息的保护,但也增加了运维的工作量,尤其当需要修改配置的时候。
4. Dynaconf:Pyhton项目的动态配置
上面介绍了三种常见的项目配置方法,最有介绍一个好用的python动态项目配置库:Dynaconf。dyanconf是OSM(Object Settings Mapper), 能够从不同的配置数据存储方式中读取配置,例如python配置文件、系统环境变量、redis、ini文件、json文件等等。
安装:pip install dynaconf
使用方式:
1
2
3
4
from dynaconfimport settings
print(settings.SOME_VARIABLE)
or
print(settings.get('SOME_VARIABLE'))
如果不希望配置跟随项目,可以通过系统环境变量来指定配置文件的位置
1
2
3
4
# using module name
export DYNACONF_SETTINGS=myproject.production_settings
# or using location path
export DYNACONF_SETTINGS=/etc/myprogram/settings.py
4.1 dyanconf读取系统环境变量中的配置
当我们部署的程序需要读取一个MYSQL_HOST的配置用于测试,不需要去重写配置文件,仅需要再系统环境变量中加入:
export DYNACONF_MYSQL_HOST=myserver.com
然后,程序便可以获取到该配置:
>>> from dynaconf import settings
>>> print(settings.MYSQL_HOST)
myserver.com
如果需要指定配置值的数值类型,则通过以下方式增加对应的系统环境变量:
1
2
3
4
5
6
export DYNACONF_NUMBER='@int 123'
export DYNACONF_FLOAT='@float 12.2'
export DYNACONF_FLAG='@bool yes'
export DYNACONF_FLAG2='@bool disabled'
export DYNACONF_LIST='@json [1, 2, 3, 4]'
export DYNACONF_DICT='@json {"name": "Bruno"}'
读取到的配置如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from dynaconfimport settings
type(settings.NUMBER)
int
type(settings.FLOAT)
float
type(settings.FLAG)
bool
print(settings.FLAG2== False)
True
print(settings.LIST[1])
2
print(settings.DICT['name'])
Bruno
4.2 通过redis存储配置
我们也可以讲配置文件存储到redis中,达到在对不同的机器共享环境变量的效果,仅需要在settings.py文件中增加一下代码:
1
2
3
4
5
6
7
8
9
10
11
12
# connection
REDIS_FOR_DYNACONF= {
'host':'localhost',
'port':6379,
'db':0
}
# and loader
LOADERS_FOR_DYNACONF= [
'dynaconf.loaders.env_loader',
'dynaconf.loaders.redis_loader' # 增加了redis的加载
]
现在可以讲配置存储到redis中,hash默认为DYNACONF_DYNACONF。dyanconf还提供了方法去将配置写入到redis:
1
2
3
4
from dynaconf.utilsimport redis_writer
from dynaconfimport settings
redis_writer.write(settings,name='test',mysql_host='localhost', MYSQL_PORT=3306)
查看Redis,存储的结果如下:
1
2
3
4
DYNACONF_DYNACONF:
NAME='test'
MYSQL_HOST='localhost'
PORT='@int 3306'
至此,python项目常见的配置方法总结完毕,不过在一些微服务架构中,会专门开发配置中心,程序直接从线上读取配置,配置的管理也会开发一套GUI,方便开发和运维。
python配置文件读取环境变量_转载:Python项目读取配置的几种方式相关推荐
- python设置环境变量_小白Python进行中
一.安装 安装包的下载 在官网进行下载,我选用Python3.8.0. Welcome to Python.orgwww.python.org 安装 安装的时候可以借鉴该视频. Windows 10 ...
- python怎么设置环境变量_百度经验_如何在Python中设置环境变量
sisanared.. 49 os.environ行为类似于python字典,因此可以执行所有常见的字典操作.除了其他答案中提到的get和set操作之外,我们还可以简单地检查是否存在密钥 Python ...
- python脚本设置环境变量_详解如何设置Python环境变量?
家好,我是Yivies!相信大家多多少少遇到过这样的情况吧?就是在安装了python之后想完整在命令提示符直接输入python就可以使用的操作,但是会出现输入了python之后找不到命令的情况!例如这 ...
- python中读取文件编码_[转载]python中使用文件的读取编码问题
原文链接:https://www.cnblogs.com/qianboping/p/6524420.html 今天想写个程序合并文件的,以前一直觉得python的编码解码好烦,只要处理文件合并之类的都 ...
- python打印多个变量_在Python中打印多个变量
python打印多个变量 Like other programming languages, In python also, we can define and print the multiple ...
- 添加java环境变量_【安装 JDK】 配置环境变量
看完这章后你会学习到以下内容: WIN64位电脑,如何配置JAVA环境? 常见的问题要如何解决? 第一步: 在任意浏览器输入"JDK下载"并找到官网 第二步:进入选择所需要的版本. ...
- 安装java 并配置环境变量_安装Java JDK并配置环境变量
学习JAVA,必须得安装一下JDK(java development kit java开发工具包),配置一下环境就可以学习JAVA了,下面是下载和安装JDK的教程: 点开链接你应该看到如下图所示的界面 ...
- macbook配置java环境变量_如何安装Java和配置环境变量
本文是Java下载.安装.环境变量配置的具体步骤,关于环境变量的原理参阅: Java轻松入门经典教程-环境变量配置ke.qq.com Java年构架师技术栈/微服务/源码分析/分布式/高并发/性能优 ...
- python代码读取外部变量_在Python中从外部文件中写入和读取特定的变量
我正在写一个程序,在这个程序中,我想在外部文件中读写具有不同数据类型的特定变量. 在尝试了几个不同的模块后,我得到的最接近的方法是使用pickle. Pickle似乎很好,因为它能理解不同的数据类型, ...
- python代码读取外部变量_关于python闭包的问题,内部函数可以获取外部函数的变量吗?...
def lazy_sum(*args): ax = 0 def sum(): for n in args: ax = ax + n return ax return sum f = ...
最新文章
- iphone如何信任软件_你还在用大众点评吗?评价软件失去信任还如何活下去
- IOS入门-TargetAction
- 项目实战12.1—企业级监控工具应用实战-zabbix安装与基础操作
- 因主机名更改造成oracle控制台登录错误:ora-12545,ora-12541
- python创建项目包
- ajax中datatype是json,dataType:'json'vs data:$ .ajax中的JSON.stringify(obj)
- android 生成泛型对象,java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法...
- python转换窗口无响应_Tkinter窗口显示(没有响应),但代码正在运行
- Express-start
- 轻量级 Lock Free 线程安全的 QueueT 的C#2.0实现
- android中xmlns的作用
- mes选型与实施指南_六大类型MES企业大盘点告诉你如何选择正确选择MES
- matlab求滤波器的相频特性,matlab仿真一阶低通滤波器幅频特性和相频特性.docx
- 高校邦后台挂课答题助手可后台可多开可答题
- [转]如何在NIOS II中读写EPCS剩余空间
- linux修改IP地址的命令
- linux ubuntu git报错fatal: unsafe repository git config --global --add safe.directory解决方案
- 关于技术人员的非技术能力
- 苹果“教主”乔布斯:一个人的世界
- 微软又发布了一款命令行神器,功能非常强大!
热门文章
- MySQL的timeout那点事
- HAProxy + Keepalived实现MySQL的高可用负载均衡
- php无框架开发web项目,web.framework
- php如何去重,php二维数组如何去重?(代码示例)
- 入门React第二天(函数式组件传值)
- C# 计算程序运行耗时的方法
- golang 微信小程序获取二维码scene参数报错 invalid scene rid: f05f96ab-5382f139-14b13d2f
- android alertdialog 自定义时间,Android自定义dialog可选择展示年月日时间选择栏
- 梦到两个人辞职,一男一女
- 全网首发:FreeSwitch BANNER支持中文