项目中一般使用 1 , 3 种 第一种:一般存储业务相关信息,如数据库配置,连接信息,各种初始化信息 第三种:密钥
签名等信息放在环境变量, 一般不跟业务代码放在一起
前三种结合flask进行测试:
第三种需要添加环境变量, key是SET_config ,value是路径。
from flask import Flask
#配置文件加载
# 从配置对象/文件加载,从环境变量中加载
#1.从对象中加载config DefaultConfig,也可以新建一个配置对象的py文件
class DefaultConfig(object):
MYSQL_URL = 'mysql address'
# 2.从配置文件中加载from_pyfile
# 3.可以加载非py文件from_envvar
app = Flask(__name__)
app.config.from_object(DefaultConfig)
app.config.from_pyfile('settings.py')
app.config.from_pyfile('env.ini')
# silent=True表示沉默,加载不到不报错;false表示不沉默,加载不到报错
app.config.from_envvar('SET_config',silent=True)
@app.route("/")
def index():
# config是flask中自带的配置对象,保存了程序的配置信息
print(app.config.get('MYSQL_URL'))
print(app.config.get('SECRET_KEY'))
# 在这里测试发现了一个问题,就是配置的名字都是大写的
print(app.config.get('SECRET_KEY_INI'))
print(app.config.get('SECRET_KEY_ENV'))
return 'hello word'
if __name__ == '__main__':
app.run()
第四种和第五种方法的参考地址:
https://zhuanlan.zhihu.com/p/421415795
第四种:
a.yaml是当前工作路径下的yaml文件
import os
import yaml
......
......
filepath = os.path.join(os.getcwd(),'a.yaml') # 文件路径,这里需要将a.yaml文件与本程序文件放在同级目录下
with open(filepath,'r') as f: # 用with读取文件更好
configs = yaml.load(f, Loader=yaml.FullLoader) # 按字典格式读取并返回
# 显示读取后的内容
print(type(configs)) #
第五种:
# -*- coding: utf-8 -*-
import os
import yaml
import argparse
......
......
def dict2namespace(config):
#声明命名空间
namespace = argparse.Namespace()
for key, value in config.items():
if isinstance(value, dict):
new_value = dict2namespace(value)
else:
new_value = value
#将参数对添加到命名空间中
setattr(namespace, key, new_value)
return namespace
def test_argparse():
parser = argparse.ArgumentParser()
parser.add_argument('--cfg',type = str,default=r"a.yaml",help="...")
args = parser.parse_args()
filepath = os.path.join(os.getcwd(), args.cfg)
with open(filepath, 'r') as f:
config = yaml.load(f, Loader=yaml.FullLoader)
configs = dict2namespace({**config, **vars(args)})
# 测试输出
print(type(configs)) #
print(configs.model)
print(configs.stage1) #Namespace(banchsize=32, number=3)
print(configs.stage1.number) #3
print(configs.model)
print(configs.model.level3.layernumber) #50
print(configs.loggfile) #loggle.log
a.yaml
stage1:
number: 3
banchsize: 32
model:
level1:
name: "cnn"
layernumber: 4
level2:
name: "lstm"
layernumber: 12
level3:
name: "resnet50"
layernumber: 50
layernormal: True
loggfile: "loggle.log"
loggstatus: 'yes'