You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止关闭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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 23:32:35