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
相关产品推荐
相关产品推荐

