Python自动化(9)------log模块
log模块实际上就是将所有print输出的信息收集起来,可以实现在pyqt5界面上显示,并且支持将所有的输出保存为文本文件的模块。
实际上还可以做得更加通用,例如增加一些前缀以区分不同的任务,不同的线程。甚至可以通过检测部分log信息中是否存在关键字,并根据关键字做一些特殊的操作(例如处理找图失败或识字失败的情况,等等)。
实现一个简单的log模块
python
#! /usr/bin env python3
# -*- coding:utf-8 -*-
# 日志模块
import os
import datetime
class Log:
def __init__(self, _screen=None, _logCallback = None) -> None:
self.logStr = ''
self.screen = _screen
self.logCallback = _logCallback
self.preOutInfo = ''
self.keyWords = []
print('Log init')
def bind(self, hwnd=None):
self.hwnd = hwnd
if self.screen:
self.screen.bind(hwnd)
self.logStr = 'hwnd: ' + self.logStr + str(hwnd) + '\n'
def save(self, info=None):
if not info:
info = self.logStr
currentdir = os.path.dirname(os.path.realpath(__file__))
file = open(currentdir+'/log_'+str(datetime.datetime.now().strftime("%Y_%m_%d"))+'.txt', "a", encoding='utf-8')
file.write(info)
file.close()
def setLogPreOutInfo(self, info):
self.preOutInfo = info
def setKeyWord(self, keyWords):
self.keyWords = keyWords
def addKeyWord(self, keyWord):
self.keyWords.append(keyWord)
def containKeyWord(self, _str:str):
for keyWord in self.keyWords:
if _str.find(keyWord) != -1:
return True
return False
def printLog(self, info):
s = str(datetime.datetime.now().strftime("%Y_%m_%d %H:%M:%S")) + '_' + self.preOutInfo + ': ' + str(info)
self.logStr = self.logStr + s + '\n'
print(s)
if self.logCallback:
self.logCallback(s)
if self.containKeyWord(info) and self.screen:
saveName = './Temp/'+str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S"))+'_'+self.preOutInfo + ': '+info+'_.png'
self.screen.captureScreen(saveName)
逻辑比较简单,核心只是把print方法封装一层,增加一些通用方法如:保存日志、设置日志前缀、设置关键词,触发关键词截屏等功能。
因为需要截屏,因此可以传入截屏模块Screen。
还有个logCallback的参数,是每次调用printLog方法时触发的回调,我一般用于显示pyqt5界面上的日志。
完整自动化工程代码:https://gitee.com/chj-self/PythonRobotization
大佬们找到问题欢迎拍砖~