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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:53:13