Windows控制台点击关闭按钮时,如何执行Python收尾代码?
Windows控制台关闭时执行Python收尾代码的解决方案
为什么atexit无效?
当点击Windows控制台右上角的「X」时,系统会向Python进程发送CTRL_CLOSE_EVENT强制关闭信号,这种信号会直接终止进程。而atexit仅在进程正常退出(如代码执行完毕、主动调用sys.exit())时才会触发,因此无法捕获这种强制关闭场景。
解决方案1:使用pywin32库处理控制台事件
先安装依赖:
pip install pywin32
示例代码:
import win32api import subprocess def handle_close_event(event): # 此处编写你的收尾逻辑 subprocess.Popen("notepad.exe") # 返回True表示已处理事件,系统不会立即强制终止进程 return True # 注册控制台事件处理函数 win32api.SetConsoleCtrlHandler(handle_close_event, True) # 模拟程序运行状态 print('Sleeping now...') while True: pass # 保持程序运行,测试时点击控制台窗口「X」
说明:SetConsoleCtrlHandler可捕获包括点击「X」(CTRL_CLOSE_EVENT)、按下Ctrl+C(CTRL_C_EVENT)在内的控制台事件,在处理函数中可执行收尾操作。
解决方案2:使用ctypes直接调用Windows API(无额外依赖)
如果不想安装第三方库,可通过ctypes调用Windows原生API实现:
import ctypes import subprocess # 定义回调函数类型 HandlerRoutine = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.c_uint) def handle_close_event(event): # 执行收尾代码 subprocess.Popen("notepad.exe") return True # 加载kernel32系统库并注册事件处理 kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) kernel32.SetConsoleCtrlHandler(HandlerRoutine(handle_close_event), True) # 模拟程序运行状态 print('Sleeping now...') while True: pass
注意事项
- 收尾代码要尽量简短高效,系统给进程处理事件的时间有限(默认几秒),超时后系统仍会强制终止进程。
- 该方案仅适用于控制台程序,GUI程序需使用对应框架的关闭事件处理逻辑。
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

