文章目录
- 前言
- 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()
效果展示:
同时起多个摄像头
总结
目前就先记录下py文件与yaml文件作为配置文件的过程,py文件是最简单的配置方式,但是缺少相应的层级关系;yaml大小写敏感、使用缩进表示层级关系,#
表示注释。
它们之间各有优劣,可以根据自己实际的需求和团队协作要求来具体选择。笔者个人建议优先yaml文件作为配置文件的方式。
2022年7月12日10:11:38