Wine 下的 Python 不处理信号

问题描述 投票:0回答:1

我正在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

python signals wine
1个回答
0
投票

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
发送到进程可能是运行信号处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.