我正在wine下玩python。我面临的问题是我无法捕获程序中的终止信号。
我跑步
$ wine python -c "import signal, time; signal.signal(signal.SIGTERM, print); time.sleep(60)"
然后我从另一个终端向 wine 发送 SIGTERM,程序被终止,但信号处理程序没有被调用。
当我运行相同的程序,但没有 wine 时,它会按预期调用信号处理程序。
$ python -c "import signal, time; signal.signal(signal.SIGTERM, print); time.sleep(60)"
15 <frame at 0x76d2aed86560, file '<string>', line 1, code <module>>
15 <frame at 0x76d2aed86560, file '<string>', line 1, code <module>>
wine下的python有什么问题?如何捕获终止信号,进行一些清理,然后优雅地退出?
葡萄酒:葡萄酒-9.0 Python:3.12.5
SIGTERM
是 Unix 概念,Windows 中不存在。 Windows 没有相当于 SIGTERM
的单一包罗万象的方法,而是要求程序彻底关闭的方法根据情况而有所不同。
通常用于 GUI 应用程序的消息系统与 Unix 信号有很大不同,但对于控制台应用程序,Windows 确实有 Console Control Handlers,其中包括
CTRL_CLOSE_EVENT
和 CTRL_LOGOFF_EVENT
等事件,它们告诉控制台应用程序它需要关闭,因为它所连接的终端正在关闭或运行它的用户正在注销。这些不能轻易地发送到 Windows 中的另一个进程,但该系统也有 CTRL_C_EVENT
,它类似于 Unix SIGINT
,并在用户按 CTRL+C 时传递到控制台应用程序。根据我自己的经验,WINE 会将 SIGINT
转换为 CTRL_C_EVENT
,而且在 Windows 中,Python 确实用 CTRL_C_EVENT
注册处理 Windows 的 signal.SIGINT
。
我不确定您在 WINE 下运行 Python 的最终目标,但对于您提供的示例,我相信用
signal.SIGTERM
替换 signal.SIGINT
并将 SIGINT
发送到进程可能是运行信号处理程序。