算法工程师常常会为监控代码而头痛,有些代码执行时间常常会长达数小时,甚至几天。
例如一些机器学习模型的训练,以及一些大数据ETL任务。
如果能够将执行过程中的一些中间重要信息发送到我们的微信上,随时随地在手机上看到程序是否正常运行,让一切都在掌握之中,
那么将会让算法工程师的许多头发免受骨肉分离,随风飘零之苦。
实际上我们通过利用Python代码发送邮件到我们的QQ邮箱,并在微信上设置QQ邮箱提醒,可以非常容易实现这个功能。
效果如下,让我们来看看怎么做吧!
微信上点击 我->设置->通用->辅助功能->QQ邮箱提醒 开启即可。
import smtplib
from email.mime.text import MIMEText
subject = "info@train_model.py" #邮件主题
msg = "auc=0.98" #邮件内容
receivers = ["2650115830@qq.com"] #收件人
#设置服务器所需信息
mail_host = 'smtp.yeah.net'
mail_user = 'PyRobot'
mail_pass = 'XDNCKUHPLRQFVQHA' #密码(部分邮箱为授权码)
sender = 'PyRobot@yeah.net'
message = MIMEText(msg,'plain','utf-8')
message['Subject'] = subject
message['From'] = sender
message['To'] = receivers[0]
#登录并发送邮件
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) #打印错误
可以将以上代码封装成函数
import smtplib
from email.mime.text import MIMEText
subject = "info@train_model.py" #邮件主题
msg = "auc=0.98" #邮件内容
receivers = ["2650115830@qq.com"] #收件人
def send_msg(receivers,subject,msg=""):
#设置服务器所需信息
mail_host = 'smtp.yeah.net'
mail_user = 'PyRobot'
mail_pass = 'XDNCKUHPLRQFVQHA' #密码(部分邮箱为授权码)
NPWPJBSIVXRTYUOB
sender = 'PyRobot@yeah.net'
#构造邮件内容
message = MIMEText(msg,'plain','utf-8')
message['Subject'] = subject
message['From'] = sender
message['To'] = receivers[0]
#登录并发送邮件
try:
smtpObj = smtplib.SMTP()
#连接到服务器
smtpObj.connect(mail_host,25)
#登录到服务器
smtpObj.login(mail_user,mail_pass)
#发送
smtpObj.sendmail(
sender,receivers,message.as_string())
#退出
smtpObj.quit()
return 'send_msg success'
except smtplib.SMTPException as e:
error = 'send_msg error : '+str(e)
print(error)
return error
send_msg(receivers,subject,msg)
有时候我们的代码执行过程中可能会出现一些预料之外的错误,我们希望能够在出错的第一时间内收到出错的消息和原因,
可以使用traceback捕获异常,并发送报错堆栈到我们的微信上。
import traceback
try:
print("train model start")
x = 100/0
print("train model start")
except Exception as e:
error_msg = traceback.format_exc()
send_msg(["2650115830@qq.com"],"error@train_model.py",error_msg)
raise e
可以将以上代码也封装成函数
import traceback
def monitor_run(function,receivers):
try:
function()
except Exception as e:
error_msg = traceback.format_exc()
send_msg(receivers,"error@"+function.__name__,error_msg)
raise e
def f():
return 1/0
monitor_run(f,["2650115830@qq.com"])
上述函数代码已经封装在了python库 bugrobot 文件中了,可以用pip安装使用。
!pip install bugrobot
import bugrobot
subject = "info@train_model.py"
msg = "auc=0.98"
receivers = ["2650115830@qq.com"]
#①send message to Email!
bugrobot.send_msg(receivers,subject,msg)
#②send the bug information to Email if any exception occor!
def f():
return 1/0
bugrobot.monitor_run(f,["2650115830@qq.com"])