python PyQt5实现vivado完成implementation后邮件提醒的demo

目录

1 功能

ug904中有提到,如果要使用远程主机启动一个或多个job,选择“在远程主机上启动运行(仅Linux)”。我如果要使用另一台windows主机专门跑程序,需要开远程控制监视运行的情况或者经常去查看,为了解决这个问题,用python pyqt5实现了一个简单的demo。

实现的功能:间隔1分钟监视vivado implementation的log文件,如果发现log中有INFO: [Common 17-206] Exiting Vivado at xxx的信息,就把之前的一些关键步骤以及搜索到的时间发送给接收的邮件地址。

2 代码

2.1 介绍

import sys
import re
import threading
import time
import win32ui
import smtplib
from email.mime.text import MIMEText

def fun_sendmail(list_info):
    print("entry fun_sendmail")
    #设置服务器所需信息
    #163邮箱服务器地址
    mail_host = 'smtp.163.com'  
    #163用户名
    mail_user = '137xxxxxxxx'  
    #密码(部分邮箱为IMAP/SMTP授权码) 
    mail_pass = 'xxxxxxxxxxxxxx'   
    #邮件发送方邮箱地址
    sender = '137xxxxxxxx@163.com'  
    #邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
    receivers = ['163xxxxxxx@qq.com']  

    #设置email信息
    #邮件内容设置
    text_str = ''.join(list_info)
    message = MIMEText(text_str,'plain','utf-8')
    #邮件主题       
    message['Subject'] = "程序跑完啦!" 
    #发送方信息
    message['From'] = sender 
    #接受方信息     
    message['To'] = receivers[0]   
    print(message)
    #登录并发送邮件
    try:
        smtpObj = smtplib.SMTP() 
        #连接到服务器
        smtpObj.connect(mail_host,25)
        #登录到服务器
        smtpObj.login(mail_user,mail_pass) 
        #发送
        smtpObj.sendmail(
            sender,receivers,message.as_string()) 
        #退出
        smtpObj.quit() 
        print('success')
    except smtplib.SMTPException as e:
        print('error',e)

def fun_serch_keyword(path):
    print("entry fun_serch_keyword")
    global list_info
    file = open(path, mode = 'r')
    info_index = 0
    info_num = len(list_info)
    time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    line = file.readline()
    while line:
        line = file.readline() 
        if(re.findall('Starting|Ending|Exiting', line)):
            info_index += 1
            if info_index > info_num:
                list_info.append(time_str+'\t'+line)
                print(line)
        if(re.findall('Exiting', line)):
            fun_sendmail(list_info)
            sys.exit(0)
    file.close()

def fun_timer():
    print("entry fun_timer")
    fun_serch_keyword(impl_runme_log_path)
    global timer
    timer = threading.Timer(60, fun_timer)
    timer.start()

list_info = []
dlg = win32ui.CreateFileDialog(1) 
dlg.SetOFNInitialDir('')          
dlg.DoModal()
impl_runme_log_path = dlg.GetPathName()
print(impl_runme_log_path)
timer = threading.Timer(1, fun_timer)
timer.start()

程序逻辑:

  1. 打开文件对话框,选择runme.log文件的路径。
  2. 嵌套例化60s计时器,每隔60s完成一次runme.log文件的关键词查找。
  3. 保存含有"Starting|Ending|Exiting"的信息。
  4. 如果有"Exiting"关键词的信息,则发送邮件。
  5. 将关键词的信息一起发送给接收邮箱。

将邮箱信息改成自己的即可使用。环境:

  • Python 3.8.8
  • PyQt5

2.2 使用

这里测试了163邮箱,获得IMAP/SMTP授权码的步骤:
python PyQt5实现vivado完成implementation后邮件提醒的demo

python PyQt5实现vivado完成implementation后邮件提醒的demo

3 打包发布

为了方便没有安装环境的主机使用,使用PyQt5写了一个界面,然后打包了一下,由于本人也是小白,所以程序可能有很多bug,目前仅测试过几次。程序介绍如下:
python PyQt5实现vivado完成implementation后邮件提醒的demo

  • 邮箱授权码使用AES算法加密,其实自己用不加密也行,为了学习python加了一下。
  • 参数存储使用QSettings实现,存储在运行文件的路径下的“config.ini”中。如果第一次运行,需要输入参数,之后就会自动加载的,其中只有授权码是加密的。
  • 运行逻辑
    • 首先点击选择路径选择当前implementation的路径
    • 点击开始,会将参数存储起来,并且查询一下选择的路径下有没有runme.log,如果没有就新建一个空白文档。因为如果没跑过implementation,或者刚开始跑的时候是没有的。
    • 如果已经有了日志文件无法新建了说明已经开始跑了,这时就直接开始每隔60s查询其中的关键词。
    • 如果查询到exiting vivado,则发送邮件。邮件的内容如下:
      python PyQt5实现vivado完成implementation后邮件提醒的demo

4 附件

python PyQt5实现vivado完成implementation后邮件提醒的demo

链接:https://pan.baidu.com/s/1ZRkBG-hMbQsAxd2MpetpXQ
提取码:open

上一篇:实验三


下一篇:photoshop调色:处理泛黄色照片