python讀取yaml配置檔案的方法

藤露發表於2024-04-25

yaml簡介
1.yaml [ˈjæməl]: Yet Another Markup Language :另一種標記語言。yaml 是專門用來寫配置檔案的語言,非常簡潔和強大,之前用ini也能寫配置檔案,看了yaml後,發現這個更直觀,更方便,有點類似於json格式

2.yaml基本語法規則:

大小寫敏感

使用縮排表示層級關係

縮排時不允許使用Tab鍵,只允許使用空格。

縮排的空格數目不重要,只要相同層級的元素左側對齊即可

#表示註釋,從這個字元一直到行尾,都會被解析器忽略,這個和python的註釋一樣

3.yaml支援的資料結構有三種:

物件:鍵值對的集合,又稱為對映(mapping)/ 雜湊(hashes) / 字典(dictionary)

陣列:一組按次序排列的值,又稱為序列(sequence) / 列表(list)

純量(scalars):單個的、不可再分的值。字串、布林值、整數、浮點數、Null、時間、日期

安裝yaml
1.使用pip安裝pyyaml模組

pip install pyyaml

安裝之後-找zhoupan安裝的 --20240425

cfg.yaml檔案

# celery config
backend: redis://127.0.0.1:6379
broker: redis://127.0.0.1:6380

# monitor config
tower_url : http://7.191.11.230:7894
chrono_url : http://10.169.50.233:8090

celery.py檔案

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
"""
celery配置檔案
"""
import celery
from celery.schedules import crontab
from datetime import timedelta
import yaml
import os
from yaml import Loader

# 獲取當前指令碼所在資料夾路徑
curPath = os.path.abspath(os.path.join(os.getcwd()))
# 獲取yaml檔案路徑
yamlPath = os.path.join(curPath, "cfg.yaml")
print(yamlPath)
# open方法開啟直接讀出來
f = open(yamlPath, 'r', encoding='utf-8')
cfg = f.read()
d = yaml.load(cfg, Loader=Loader)  # 用load方法轉字典

# 任務儲存的資料庫
backend = d.get('backend')
# 訊息中介軟體
broker =  d.get('broker')

cel = celery.Celery('celery_demo',
                    backend=backend,
                    broker=broker,
                    # 包含以下兩個任務檔案,去相應的py檔案中找任務,對多個任務做分類
                    include=[
                             'celery_tasks.task_execute_pre',
                             'celery_tasks.task_execute_post',
                             'celery_tasks.task_execute_main',
                             'celery_tasks.task_query',
                             'celery_tasks.task_status',
                             'celery_tasks.process_task'
                             ])

# 時區
cel.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
cel.conf.enable_utc = False

# 新增定時排程器
cel.conf.beat_schedule = {
    # 每一個元素都是一個定時任務,每一個元素的key是定時任務的名稱
    'task_execute_main': {
            'task': 'celery_tasks.task_execute_main.execute_main_task',
            "schedule": timedelta(seconds=10),
            # 'schedule': crontab(minute="*/2"),
            'args': ('task_execute_main',)
        },
    'task_execute_post': {
        'task': 'celery_tasks.task_execute_post.execute_post_task',
        "schedule": timedelta(seconds=10),
        # 'schedule': crontab(minute="*/2"),
        'args': ('task_execute_post',)
    },
    'task_execute_pre': {
        'task': 'celery_tasks.task_execute_pre.execute_pre_task',
        "schedule": timedelta(seconds=10),
        # 'schedule': crontab(minute="*/2"),
        'args': ('task_execute_pre',)
    },
    'task_query': {
        'task': 'celery_tasks.task_query.parse_job_id',
        "schedule": timedelta(seconds=10),
        # 'schedule': crontab(minute="*/2"),
        'args': ('task_query',)
    },
    'task_status': {
        'task': 'celery_tasks.task_status.query_job_status',
        "schedule": timedelta(seconds=10),
        # 'schedule': crontab(minute="*/2"),
        'args': ('task_status',)
    },
    'process_task': {
        'task': 'celery_tasks.process_task.process_task',
        "schedule": timedelta(seconds=10),
        # 'schedule': crontab(minute="*/2"),
        'args': ('process_task',)
    }
}

參考部落格:https://blog.csdn.net/zhusongziye/article/details/80024426

相關文章