目录
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()
程序逻辑:
- 打开文件对话框,选择runme.log文件的路径。
- 嵌套例化60s计时器,每隔60s完成一次runme.log文件的关键词查找。
- 保存含有"Starting|Ending|Exiting"的信息。
- 如果有"Exiting"关键词的信息,则发送邮件。
- 将关键词的信息一起发送给接收邮箱。
将邮箱信息改成自己的即可使用。环境:
- Python 3.8.8
- PyQt5
2.2 使用
这里测试了163邮箱,获得IMAP/SMTP授权码的步骤:
3 打包发布
为了方便没有安装环境的主机使用,使用PyQt5写了一个界面,然后打包了一下,由于本人也是小白,所以程序可能有很多bug,目前仅测试过几次。程序介绍如下:
- 邮箱授权码使用AES算法加密,其实自己用不加密也行,为了学习python加了一下。
- 参数存储使用QSettings实现,存储在运行文件的路径下的“config.ini”中。如果第一次运行,需要输入参数,之后就会自动加载的,其中只有授权码是加密的。
- 运行逻辑
- 首先点击
选择路径
选择当前implementation的路径 - 点击
开始
,会将参数存储起来,并且查询一下选择的路径下有没有runme.log,如果没有就新建一个空白文档。因为如果没跑过implementation,或者刚开始跑的时候是没有的。 - 如果已经有了日志文件无法新建了说明已经开始跑了,这时就直接开始每隔60s查询其中的关键词。
- 如果查询到exiting vivado,则发送邮件。邮件的内容如下:
- 首先点击
4 附件
链接:https://pan.baidu.com/s/1ZRkBG-hMbQsAxd2MpetpXQ
提取码:open