如何阻止关闭Windows CMD终端以实现Python程序优雅退出?
拦截Windows CMD终端关闭事件并执行Python清理操作
在Windows环境下,Python无法直接捕获终端窗口关闭事件,需要通过调用Windows API来实现。以下是具体实现方案:
核心实现思路
利用ctypes库调用Windows内核的SetConsoleCtrlHandler函数,注册自定义的控制台事件处理函数,拦截窗口关闭事件(CTRL_CLOSE_EVENT)并执行清理逻辑。
完整代码示例
import ctypes import time # 控制台事件处理函数:返回True表示已处理事件,系统不会强制终止程序 def console_ctrl_handler(event): # 事件码2对应窗口关闭操作(CTRL_CLOSE_EVENT) if event == 2: print("\n=== 开始执行清理操作 ===") # 在这里编写你的清理逻辑:比如关闭文件句柄、释放网络连接、保存状态等 # 示例:模拟清理耗时 time.sleep(2) print("=== 清理完成,程序即将退出 ===") return True return False # 注册事件处理函数到系统 handler_func = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.c_uint)(console_ctrl_handler) ctypes.windll.kernel32.SetConsoleCtrlHandler(handler_func, True) # 程序主循环(无限运行) print("程序启动成功,点击终端窗口关闭按钮可触发清理") while True: # 这里是你的业务逻辑,示例为休眠 time.sleep(1)
批处理启动说明
创建批处理文件(比如run_program.bat),内容如下:
@echo off python your_script.py
双击该批处理即可启动程序,此时点击终端窗口的关闭按钮会触发清理操作。
注意事项
- 清理操作需简洁高效:Windows给事件处理函数的执行时间上限约为5秒,超时后系统会强制终止进程。
- 可扩展处理其他事件:比如事件码
0对应CTRL_C_EVENT(Ctrl+C快捷键),如需拦截可在处理函数中添加判断。 - 测试时避免强制结束进程:直接用任务管理器结束Python进程会跳过清理逻辑,建议通过窗口关闭按钮测试。
内容的提问来源于stack exchange,提问作者Federico Massimi
相关产品推荐
相关产品推荐

