python 程序终止时执行退出函数atexit

atexit函数介绍可参考python 之atexit 模块学习

atexit应用场景

atexit可以在程序正常结束运行退出时调用(异常报错中断不会调用),除此之外,atexit 也可以捕捉sys.exit(), os._exit()等退出的情况。当程序出现这些终止或退出时,系统在退出之前会执行atexit函数。若程序结束前需要对一些数据进行处理则可以使用该函数。

使用实例

该实例编写了一个telnet多个站点并获取结果的过程,在该过程中使用atexit获取运行结束时telnet成功率。由于该程序可能存在ctrl+c终止程序的情况,所以设计程序时也使用了try…except…来捕获异常退出时也能正常处理数据。关于该脚本部分详细解析可参考:python编写脚本通过telnet监控站点状态

  • config.ini
- [Others]
;访问次数
run_times = 10000
;每次访问间隔时间
sleep_time = 30

;站点列表
[web1]
;站点域名或IP
host = 192.168.20.1
;端口
port = 80
;telnet超时时间
timeout = 5
[web2]
host = 192.168.20.2
port = 80
timeout = 5
  • telnet.py
import codecs
import telnetlib
import time
import traceback
import configparser
import atexit

config = configparser.ConfigParser()

config.read('config.ini', encoding="utf-8")
webs = config.sections()
run_times = int(config.get('Others', 'run_times'))  # 循环次数
sleep_time = int(config.get('Others', 'sleep_time'))  # 间隔时间


def get_accuracy(right_times, all_times):
    fp = codecs.open("telnet_log.txt", 'a', 'utf-8')  # 如果有这个文件就打开,如果没有这个文件就创建一个名叫telnet_log的txt文件
    fp.write('返回运行总次数:' + str(all_times) + '\n')
    fp.write('返回每个站点正确次数:' + str(right_times) + '\n')
    fp.close()
    for x in range(1, len(webs)):
        host = config.get(webs[x], 'host')
        accuracy = (right_times[x-1]/all_times)
        print(host+'正确率:{:.2%}'.format(accuracy))
        fp = codecs.open("telnet_log.txt", 'a', 'utf-8')  # 如果有这个文件就打开,如果没有这个文件就创建一个名叫telnet_log的txt文件
        fp.write(host+'正确率:{:.2%}'.format(accuracy) + '\n')
        fp.close()


def telnet_webs():
    try:
        right_times = [0 for x in range(1, len(webs))]
        all_times = 1
        for i in range(1, run_times):
            for j in range(1, len(webs)):
                try:
                    # 连接Telnet服务器
                    host = config.get(webs[j], 'host')
                    port = config.get(webs[j], 'port')
                    timeout = int(config.get(webs[j], 'timeout'))
                    tn = telnetlib.Telnet(host, port, timeout=timeout)
                    print('telnet '+host+' '+port+' Success:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '\n')
                    fp = codecs.open("telnet_log.txt", 'a', 'utf-8')  # 如果有这个文件就打开,如果没有这个文件就创建一个名叫telent_log的txt文件
                    fp.write('telnet '+host+' '+port+' Success:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '\n')
                    right_times[j-1] = right_times[j-1] + 1
                    fp.close()
                    tn.close()
                except:
                    print('telnet '+host+' '+port+' Failed:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '\n')
                    fp = codecs.open("telnet_log.txt", 'a', 'utf-8')  # 如果有这个文件就打开,如果没有这个文件就创建一个名叫telnet_log的txt文件
                    fp.write('telnet '+host+' '+port+' Failed:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '\n')
                    fp.close()
                    traceback.print_exc(file=open('telnet_error_log.txt', 'a+'))  # python运行报错日志记录到telnet_error_log.txt
            time.sleep(sleep_time)
            all_times = all_times+1
    except Exception as errorMsg:
        print('程序异常中断%s' % errorMsg)
    finally:
        print('返回运行总次数:', all_times)
        print('返回每个站点正确次数:', right_times)
        return right_times, all_times


if __name__ == '__main__':
    res = telnet_webs()
    right_times = res[0]
    all_times = res[1]
    atexit.register(get_accuracy, right_times, all_times)

你可能感兴趣的:(python,开发语言)