如何在python脚本遇到错误或停止时通知自己?

2024-10-03 21:31:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python脚本,它运行在Ubuntu上并处理MySQL数据库的内容。当脚本运行到未处理的exception或完成处理时,我希望得到通知。在

怎样才能做到这一点?

我想用this SO-Answer中所示的方法从python内部给自己发送一封电子邮件,但要做到这一点,我必须硬编码我的loginda—这是我不习惯的(脚本在公司内部的公共服务器上运行)。在

有什么建议可以绕过这个问题,或者用更合适的方式来实现呢?在


Tags: 方法answer服务器脚本数据库内容编码so
3条回答

通过SMTP发送电子邮件时,通常不需要提供登录数据。如果我是你,我会用你链接到的答案中给出的代码进行实验,然后在你公司的SMTP服务器上试用。在

这是我编写并使用的一个异常处理程序,它在脚本终止时向异常发送电子邮件。用sys.excepthook = ExceptHook设置它:

import os
import sys
import traceback
import re
import smtplib
import getpass

def ExceptHook(etype, value, tb):
    """Formats traceback and exception data and emails the error to me: &^&^@&^&^&.com.

    Arguments:
    etype -- Exception class type
    value -- Exception string value
    tb -- Traceback string data
    """

    excType = re.sub('(<(type|class \')|\'exceptions.|\'>|__main__.)', '', str(etype)).strip()
    Email = {'TO':"*****@*****.com", 'FROM':getpass.getuser() + '@blizzard.com', 'SUBJECT':'**  Exception **', 'BODY':'%s: %s\n\n' % (excType, etype.__doc__)}

    for line in traceback.extract_tb(tb):
        Email['BODY'] += '\tFile: "%s"\n\t\t%s %s: %s\n' % (line[0], line[2], line[1], line[3])
    while 1:
        if not tb.tb_next: break
        tb = tb.tb_next
    stack = []
    f = tb.tb_frame
    while f:
        stack.append(f)
        f = f.f_back
    stack.reverse()
    Email['BODY'] += '\nLocals by frame, innermost last:'
    for frame in stack:
        Email['BODY'] += '\nFrame %s in %s at line %s' % (frame.f_code.co_name, frame.f_code.co_filename, frame.f_lineno)
        for key, val in frame.f_locals.items():
            Email['BODY'] += '\n\t%20s = ' % key
            try:
                Email['BODY'] += str(val)
            except:
                Email['BODY'] += '<ERROR WHILE PRINTING VALUE>'
    thisHost = socket.gethostname()
    thisIP = socket.gethostbyname(thisHost)
    gmTime = time.gmtime()
    logName = 'SomeTool_v%s_%s_%s_%s.%s.%s_%s.%s.%s.log' % (__version__, thisHost, thisIP, gmTime.tm_mon, gmTime.tm_mday, gmTime.tm_year, gmTime.tm_hour, gmTime.tm_min, gmTime.tm_sec)
    if not os.path.exists(LOGS_DIR):
        try:
            os.mkdir(LOGS_DIR)
        except:
            baseLogDir = os.path.join(NET_DIR, "logs")
            if not os.path.exists(baseLogDir):
                try:
                    os.mkdir(baseLogDir)
                except:
                    pass
                else:
                    open(os.path.join(baseLogDir, logName), 'w').write(Email['BODY'])
        else:
            open(os.path.join(LOGS_DIR, logName), 'w').write(Email['BODY'])
    Email['ALL'] = 'From: %s\nTo: %s\nSubject: %s\n\n%s' % (Email['FROM'], Email['TO'], Email['SUBJECT'], Email['BODY'])
    server = smtplib.SMTP(MY_SMTP)
    server.sendmail(Email['FROM'], Email['TO'], Email['ALL'])
    server.quit()

if __name__ == '__main__':
    sys.excepthook = ExceptHook
    try:
        1 / 0
    except:
        sys.exit()

这是一种魅力:https://www.quora.com/How-can-I-send-a-push-notification-to-my-Android-phone-with-a-Python-script

在PC上:安装通知我

pip install notify-run

然后注册为:notify-run register

现在在你的手机上扫描代码并允许来自这个网站的通知。在

然后脚本可以这样通知您:

^{pr2}$

相关问题 更多 >