文章目录

  • 前言
  • py文件作为配置文件
  • yaml文件作为配置文件
  • 总结



前言

在运行项目程序时通常会有一个配置文件,配置文件是用于配置程序的参数和初始化设置的文件。

比如现在要做一个项目,在部署程序时,需要摄像头IP地址、数据库地址、数据库名称,这些都可以作为配置项写入配置文件。当程序实地部署时,只需要修改配置文件,不需要去代码当中到处查找修改。

本文以下配置内容以配置多个摄像头为例。


py文件作为配置文件

新建一个config.py文件,将程序运行所需的摄像头参数写入一个类中。

# -*- coding: utf-8 -*- 
# @Time : 2022/7/11 16:03 
# @Author : JulyLi
# @File : config.py.py

class Config:
    cam1_ulr = "rtsp://admin:admin111@192.168.1.100:554/main"
    cam2_ulr = "rtsp://admin:admin111@192.168.1.101:554/main"

测试代码:

# -*- coding: utf-8 -*- 
# @Time : 2022/7/11 16:14 
# @Author : JulyLi
# @File : run_cam.py

import cv2
from multiprocessing import Process
import time
from config import Config


def video_show(url):
    capture = cv2.VideoCapture(url)
    while True:
        ref, frame = capture.read()
        if ref is False:
            print("视频读取失败:{}".format(url))
            time.sleep(0.5)
            capture = cv2.VideoCapture(url)  # 重新进行获取
            print("视频重连成功")
            continue
        cv2.namedWindow("demo", 0)
        cv2.imshow("demo", frame)
        cv2.waitKey(1)


def main():
    cam1_ulr = Config.cam1_ulr
    cam2_ulr = Config.cam2_ulr
    p = Process(target=video_show, args=(cam1_ulr,))
    p.start()
    p = Process(target=video_show, args=(cam2_ulr,))
    p.start()


if __name__ == '__main__':
    main()

yaml文件作为配置文件

首先需要安装相应的包

pip install pyyaml

yaml支持的数据结构有3种:

  • 对象:键值对的集合,又称映射(mapping)/哈希(hashes)/字典(dictionary)
  • 数组:一组按次序排列的值,又称序列(sequence)/列表(list)
  • 纯量(scalars):单个的,不可再分的值

对象:对象的一组键值,使用冒号表示(注意:编写的时候最好冒号前后各空一个空格)

animal : dog

类似于python中的字典

{animal : "dog"}

数组:一组连词线构成的行,组成一组数组

- animal
- vegetables
- meet
- people

类似于python中的列表

["animal","vegetables","meet","people"]

复合结构:对象和数组可以结合使用,形成复合结构

language:
	- Python
	- Java
	- PHP
websites:
	Python : python.org
	Java : java.com
	YAML : yaml.org

转换为python形式:

{language:["Python","Java","PHP"],websites:{"Python":"python.org","Java":"java.com","YAML":"yaml.org"}}

新建一个config.yaml文件,将程序运行所需的摄像头参数写入一个类中。

cam_config:
  -
    url: rtsp://admin:admin111@192.168.1.100:554/main
  -
    url: rtsp://admin:admin111@192.168.1.101:554/main

测试代码:

# -*- coding: utf-8 -*- 
# @Time : 2022/5/18 17:47 
# @Author : JulyLi
# @File : run_cam.py

import cv2
import yaml
from multiprocessing import Process
import time


def video_show(url):
    capture = cv2.VideoCapture(url)
    while True:
        ref, frame = capture.read()
        if ref is False:
            print("视频读取失败:{}".format(url))
            time.sleep(0.5)
            capture = cv2.VideoCapture(url)  # 重新进行获取
            print("视频重连成功")
            continue
        cv2.namedWindow("demo",0)
        cv2.imshow("demo", frame)
        cv2.waitKey(1)



def main():
    file = open('test.yaml', 'r', encoding="utf-8")
    # datas为load_all()方法返回的迭代器对象
    datas = yaml.load(file, Loader=yaml.FullLoader)
    # for data in datas:
    print(datas)
    cam_data = datas["cam_config"]
    print(cam_data)
    print(len(cam_data))
    for i in range(len(cam_data)):
        url = cam_data[i]["url"]
        p = Process(target=video_show, args=(url,))
        p.start()


if __name__ == '__main__':
    main()

效果展示:

同时起多个摄像头

conf python 配置文件 python设置配置文件_python


总结

目前就先记录下py文件与yaml文件作为配置文件的过程,py文件是最简单的配置方式,但是缺少相应的层级关系;yaml大小写敏感、使用缩进表示层级关系,#表示注释。

它们之间各有优劣,可以根据自己实际的需求和团队协作要求来具体选择。笔者个人建议优先yaml文件作为配置文件的方式。

2022年7月12日10:11:38