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

PyInstaller打包的Python程序如何在关闭控制台时执行logout函数?

实现控制台关闭时执行logout函数的方案

在Windows环境下,控制台窗口关闭时不会触发常规的SIGINT信号,需要通过Windows API注册控制台事件处理器来捕获关闭事件,进而执行你的logout函数。以下是具体实现步骤:

1. 依赖准备

需要安装两个Python库:

  • pywin32:用于调用Windows API捕获控制台事件
  • requests:用于发送HTTP请求到AWS Lambda

执行安装命令:

pip install pywin32 requests

2. 核心代码实现

在main.py中添加以下代码,实现事件捕获与logout逻辑:

import win32api
import win32con
import requests
import time
import sys

def logout():
    """向AWS Lambda发送注销请求"""
    lambda_url = "你的AWS Lambda函数URL"
    try:
        # 发送POST请求,根据你的Lambda需求调整请求方法和参数
        response = requests.post(lambda_url, json={"action": "logout"}, timeout=5)
        response.raise_for_status()
        print("注销请求发送成功")
    except Exception as e:
        print(f"注销请求发送失败: {str(e)}")
        # 可根据需要添加日志记录等操作

def console_handler(event):
    """控制台事件回调处理器"""
    if event == win32con.CTRL_CLOSE_EVENT:
        # 捕获控制台关闭事件,执行logout
        logout()
        # 返回True告诉系统我们已处理事件,避免强制立即终止
        return True
    return False

# 注册控制台事件处理器
win32api.SetConsoleCtrlHandler(console_handler, True)

if __name__ == "__main__":
    print("程序已启动,关闭控制台窗口将执行注销操作...")
    # 主进程持续运行逻辑,这里用循环+sleep模拟
    while True:
        try:
            time.sleep(1)
        except KeyboardInterrupt:
            # 处理Ctrl+C的情况,也执行logout
            logout()
            sys.exit(0)

3. PyInstaller打包注意事项

打包时需要确保pywin32和requests的依赖被正确包含,使用以下命令打包:

pyinstaller --onefile main.py

如果出现依赖缺失的问题,可手动指定隐藏导入:

pyinstaller --onefile --hidden-import win32api --hidden-import requests main.py

关键说明

  • CTRL_CLOSE_EVENT是Windows控制台关闭时触发的事件类型,通过SetConsoleCtrlHandler注册回调后,系统会在关闭前调用我们的处理函数
  • logout函数中设置了5秒超时,避免因网络问题导致程序无法正常退出
  • 同时处理了KeyboardInterrupt(Ctrl+C)的情况,确保两种终止方式都能执行注销逻辑

内容的提问来源于stack exchange,提问作者nat-echlin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:55:51