详情

首页手游攻略 python如何通过yaml文件来实现方式环境配置实用指南

python如何通过yaml文件来实现方式环境配置实用指南

佚名 2026-11-10 14:20:01

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“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文件适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。

点击查看更多
推荐专题
热门阅读