python如何通过yaml文件来实现方式环境配置实用指南
平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“python如何借助yaml文件来实现方法环境配置”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
python借助yaml文件环境设置
YAML 的官方网站
python实现拿到YAML 文件的完整路径
import os
from typing import Union
BASE_DIR: Union[bytes, str] = os.path.dirname(os.path.abspath(__file__))
def get_file_path(folder: str, env: str, filename: str):
"""
:param folder: 文件夹名称
:param env: 环境命名文件夹名称
:param filename: yaml文件名
:return: 返回文件路径
"""
file_path = os.path.join(BASE_DIR, folder, env, filename)
return file_path
以上这段代码定义了一个函数 get_file_path(),用来拿到指定文件夹、环境命名文件夹和 YAML 文件的完整路径。
函数接受三个参数
folder:文件夹名称。env:环境命名文件夹名称。filename:YAML 文件名。
在这个场景下,函数借助调用 Python 标准库 os.path 模块中的 join() 函数,将文件夹名称、环境命名文件夹名称和 YAML 文件名拼接成完整的文件路径。其中,BASE_DIR 表示当前 Python 文件所在的目录,采用 os.path.abspath(__file__) 函数拿到当前 Python 文件的绝对路径,随后采用 os.path.dirname() 函数拿到该文件所在的目录路径,最后将这个目录路径保存到 BASE_DIR 变量中。采用示例:
config_file_path = get_file_path('config', 'dev', 'config.yml')
print(config_file_path)
输出:
/home/user/project/config/dev/config.yml
读取yaml文件
import yaml
def get_custompath_yam(config_file):
"""读取根据自定义路径的yaml文件获得文件中的数据
:param config_file:文件路径
:return:
"""
with open(config_file, 'r') as f:
config = yaml.safe_load(f)
return config
定义环境文件名称
以下是yaml文件为主的环境数据
我们开始对上面的yaml文件进行读取数据,代码如下所示:
from Common.Tools.Read_Write_Create.read_File_Contents import get_custompath_yam
from Global.Base_setting_info.File_base import BASE_DIR
def ConfigLoader(env):
"""
:param env: 传入环境
:return:
"""
if env == 'dev' or env == 'DEV':
# datapath = os.path.join(BASE_DIR, 'datas', env, 'datas.yaml')
datapath = get_file_path('datas', env, 'datas.yaml')
elif env == 'test' or env == 'TEST':
# datapath = os.path.join(BASE_DIR, 'datas', env, 'datas.yaml')
datapath = get_file_path('datas', env, 'datas.yaml')
elif env == 'pre' or env == 'PRE':
# datapath = os.path.join(BASE_DIR, 'datas', env, 'datas.yaml')
datapath = get_file_path('datas', env, 'datas.yaml')
else:
raise EnvironmentError(f'Please set up your environment ! Current Context:{env}')
datas = get_custompath_yam(datapath)
return env, datas
以上这段代码定义了一个函数 ConfigLoader(),用来根据环境参数拿到对应的 YAML 设置文件内容。
函数接受一个参数
env:环境参数,能够是 ‘dev’、‘test’ 或 ‘pre’。
在这个场景下,函数借助判断传入的环境参数,调用之前定义的 get_file_path() 函数拿到对应的 YAML 设置文件路径,随后调用之前定义的 get_custompath_yam() 函数,拿到 YAML 设置文件的内容。最后将环境参数和 YAML 设置文件的内容作为元组得到。
采用示例:
env = 'dev'
env, datas = ConfigLoader(env)
print(env)
print(datas)
输出:
dev
{'database': {'host': 'localhost', 'port': 3306, 'user': 'root', 'password': '123456', 'database': 'mydb'}}
结合项目来看,最后写一个yaml文件来控制环境变量,你只需在yaml文件中变更环境即可
示例代码:
def get_ConfigLoader():
datapath = os.path.join(BASE_DIR, 'datas', 'application_env.yaml')
data = get_custompath_yam(datapath)
# with open(datapath, 'r') as f:
# data = yaml.safe_load(f)
# print(data['profiles']['env'])
return data['profiles']['env']
# print(get_ConfigLoader())
最后代码如下所示:
import yaml
def get_custompath_yam(config_file):
"""读取根据自定义路径的yaml文件获得文件中的数据
:param config_file:文件路径
:return:
"""
with open(config_file, 'r') as f:
config = yaml.safe_load(f)
return config_data
import os
import yaml
from Common.Tools.Read_Write_Create.read_File_Contents import get_custompath_yam
from Global.Base_setting_info.File_base import BASE_DIR
def get_file_path(folder: str, env: str, filename: str) -> str:
"""
:param folder: 文件夹名称
:param env: 环境命名文件夹名称
:param filename: yaml文件名
:return: 返回文件路径
"""
file_path = os.path.join(BASE_DIR, folder, env, filename)
return file_path
def ConfigLoader(env):
"""
:param env: 传入环境
:return:
"""
if env == 'dev' or env == 'DEV':
# datapath = os.path.join(BASE_DIR, 'datas', env, 'datas.yaml')
datapath = get_file_path('datas', env, 'datas.yaml')
elif env == 'test' or env == 'TEST':
# datapath = os.path.join(BASE_DIR, 'datas', env, 'datas.yaml')
datapath = get_file_path('datas', env, 'datas.yaml')
elif env == 'pre' or env == 'PRE':
# datapath = os.path.join(BASE_DIR, 'datas', env, 'datas.yaml')
datapath = get_file_path('datas', env, 'datas.yaml')
else:
raise EnvironmentError(f'Please set up your environment ! Current Context:{env}')
datas = get_custompath_yam(datapath)
return env, datas
# print(ConfigLoader('dev'))
def get_ConfigLoader():
datapath = os.path.join(BASE_DIR, 'datas', 'application_env.yaml')
data = get_custompath_yam(datapath)
# with open(datapath, 'r') as f:
# data = yaml.safe_load(f)
# print(data['profiles']['env'])
env=data['profiles']['env']
return ConfigLoader(env)
# print(get_ConfigLoader())
最后输出:
('test', {'TEST': {'app': {'host': 'http://192.168.**.***', 'port': None}, 'console': {'host': 'http://192.168.**.***', 'port': None}}})
总结
实际处理时,总的来说,python yaml文件适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。
-
-
- AI生成的短视频配图会不会侵权?发布前核对这几项
- 11.10
-
- 短视频批量制作怎么省工?从文案到导出分四步
- 11.10
-
-
-
-
下载
- |
-
-
下载
- 《行尸走肉第一章》免安装中文汉化硬盘版下载
- 单机|436 MB
- 一款以动作冒险为主题的游戏
-
-
下载
- 《街头霸王X铁拳》免安装中文汉化硬盘版下载
- 单机|111MB
- 一款非常好玩的格斗游戏
-
-
下载
- |
-
-
下载
- 《暗黑破坏神3》免安装繁体中文正式版下载
- 单机|7630 MB
- 一款以角色扮演为主题的游戏
-
-
下载
- 《马克思佩恩3》免安装硬盘版下载
- 单机|27033 MB
- 一款以第三人称射击为主题的游戏