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

如何在停止python脚本之前运行命令,python,Python,我有一个python代码,它在端口5002上启动UDP通信。因此,当我第一次运行代码时,它工作正常,然后我使用ctlr z/ctrl c关闭python脚本,然后再次运行代码,它显示以下错误: sock.bind(address) OSError: [Errno 98] Address already in use 这可能是因为python脚本正在运行并使端口繁忙。所以它向我展示了上面的错误。为了解决这个问题,我考虑在代码终止sock.close之前运行这两个命令以关闭套接字,并在sys.ex

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

sock.bind(address)
OSError: [Errno 98] Address already in use
这可能是因为python脚本正在运行并使端口繁忙。所以它向我展示了上面的错误。为了解决这个问题,我考虑在代码终止sock.close之前运行这两个命令以关闭套接字,并在sys.exit正确退出python脚本之前运行这两个命令。这就是为什么我需要知道如何在代码终止之前运行这些命令。我不能使用KeyboardInterruptException,因为将来它将作为服务运行

我发现了这一点,但无法实现它。例如,如果我这样做:

import atexit
import time

def exit_handler():
    print("STOPPED")

while True:
    print("Running....")
    time.sleep(1)
    atexit.register(exit_handler)
这会继续运行,但当我杀死代码时,它不会停止打印。如何实施,或者是否有其他方法处理我的情况

谢谢

atexit模块的文档中有一个重要提示:

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

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

因此,您应该为SIGTERM和SIGINT注册处理程序:

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

@我不想用键盘中断来终止代码。将有一个服务启动或停止此代码。所以不能使用键盘中断。好吧,我想你是指键盘中断,因为你在问题中提到了ctlr z/ctrl c。如果你得到的地址已经在使用中,这意味着你的脚本仍在工作,所以你实际上没有杀死它。如果您真的杀死了它,它将释放资源,端口将可用。