如何在停止python脚本之前运行命令

时间:2017-11-24 10:41:53

标签: python

我有一个python代码,它在端口5002上启动UDP通信。那么当我第一次运行代码时它会正常工作然后我使用ctlr z/ctrl c关闭python脚本然后再次运行它在下面显示错误的代码:

sock.bind(address)
OSError: [Errno 98] Address already in use

这可能是因为python脚本正在运行并且保持端口忙。所以它告诉我上面的错误。为了解决这个问题,我想在代码终止sock.close()以关闭套接字之前运行这两个命令,并sys.exit()正确退出python脚本。这就是为什么我需要知道如何在代码被杀之前运行这些命令。我不能使用KeyboardInterrupt例外,因为将来这将作为服务运行。

我发现了这个answer但却无法实现它。例如,如果我这样做:

import atexit
import time

def exit_handler():
    print("STOPPED")

while True:
    print("Running....")
    time.sleep(1)
    atexit.register(exit_handler)

这一直在运行但是当我终止代码时它不会打印Stopped。如何实现它,或者有任何其他方式来处理我的情况。

由于

1 个答案:

答案 0 :(得分:1)

atexit模块的文档有一个重要的注释:

  

注意:当程序被Python未处理的信号杀死时,不会调用通过此模块注册的函数

这意味着如果您在没有特殊处理的情况下终止脚本,则不会调用已注册的函数。

所以你应该为SIGTERM和SIGINT注册处理程序:

signal.signal(SIGTERM, (lambda signum, frame: exit_handler()))
signal.signal(SIGINT, (lambda signum, frame: exit_handler()))