我有一个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
。如何实现它,或者有任何其他方式来处理我的情况。
由于
答案 0 :(得分:1)
atexit
模块的文档有一个重要的注释:
注意:当程序被Python未处理的信号杀死时,不会调用通过此模块注册的函数
这意味着如果您在没有特殊处理的情况下终止脚本,则不会调用已注册的函数。
所以你应该为SIGTERM和SIGINT注册处理程序:
signal.signal(SIGTERM, (lambda signum, frame: exit_handler()))
signal.signal(SIGINT, (lambda signum, frame: exit_handler()))