Python - 如何检测用户何时通过“X”按钮关闭控制台应用程序

6
我目前在Windows平台上运行一个基于控制台的Python程序。该程序将大部分数据存储在内存中,并定期将数据保存到磁盘,或者当用户通过键盘中断事件(Ctrl + C)关闭应用程序时。

问题在于,当用户点击控制台窗口右上角的“X”按钮时,会话关闭并且内存中的数据会丢失。我正在寻找一种事件/信号或挂钩,以便在关闭之前清理内存。
我希望在不使用任何外部库的情况下完成此操作,但如果不可能,我仍然想知道如何实现。

我相信监听“X”按钮是特定于平台的。 - dappawit
1个回答

7

在Windows中

如果您正在使用pywin32,您可以在控制台关闭之前执行一个事件。我不确定这是否会告诉您是谁或什么正在关闭它,但也许这能让您走一半路。 您还可以查看:防止控制台应用程序在非现有终端调用时关闭...

def on_exit(signal_type):
   print('caught signal:', str(signal_type))

import win32api
win32api.SetConsoleCtrlHandler(on_exit, True)

对于那些使用Linux的人...

当你关闭SSH会话/窗口时,系统会发送SIGHUP信号(信号挂起)。

import signal

signal.signal( signal.SIGHUP, handler )

def handler(signum, frame):
  #this is called when the terminal session is closed
  #do logic before program closes
  pass

如果用户在Windows下使用“X”按钮关闭窗口,似乎这样做不起作用。 - LgZ-optical
atexit无法捕获Windows X关闭。 - Lior Dahan
已更新示例,使用wind32api.SetConsoleCtrlHandler - 这适用于更广泛的情况,但需要pywin32。 - Ben DeMott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接