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

Wine环境下Python无法捕获SIGTERM信号的问题及解决方法

问题:Wine环境下Python无法捕获SIGTERM信号

在Wine 9.0环境中运行Python 3.12.5时,出现无法捕获SIGTERM信号的问题:
执行以下命令启动Python程序:

$ wine python -c "import signal, time; signal.signal(signal.SIGTERM, print); time.sleep(60)"

从另一个终端向wine进程发送SIGTERM信号后,程序直接终止,但信号处理函数未被调用。

而原生Linux环境下运行相同代码,信号处理函数能正常触发:

$ 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作为Windows程序兼容层,对Unix信号(如SIGTERM)的处理逻辑与原生Linux环境完全不同。当向wine主进程发送SIGTERM时,Wine会直接终止整个Windows程序容器,不会将信号转发给容器内运行的Python进程。
  • 原生Linux中Python直接运行在操作系统进程空间,可直接接收并处理Unix信号;但Wine内的Python作为Windows进程运行,Unix信号无法穿透Wine的隔离层被Python捕获。

解决方法

1. 直接向Wine内的Python进程发送信号

先找到Wine中Python对应的原生Linux进程PID(而非wine主进程的PID),可以用以下命令查找:

ps aux | grep python

找到对应的PID后,直接发送SIGTERM:

kill -SIGTERM <Python进程PID>

这种方式下,信号会被Wine转发给内部的Python进程,触发预设的信号处理函数。

2. 使用Windows原生终止机制替代Unix信号

Wine内的程序本质是Windows程序,更适合用Windows原生的终止通知机制。可以借助pywin32库监听Windows控制台终止事件:

import win32api
import win32event
import time

def cleanup_and_exit(event):
    print("执行清理操作...")
    # 在这里编写你的清理逻辑(如关闭文件、释放资源等)

# 注册控制台终止事件处理器
win32api.SetConsoleCtrlHandler(lambda event: cleanup_and_exit(event) or True, True)

# 模拟程序运行
while True:
    time.sleep(1)

使用Windows风格的终止命令触发时,会执行清理函数:

wine taskkill /im python.exe

3. 用Shell脚本封装,转发终止信号

编写一个Shell脚本,启动Wine Python的同时监听自身的SIGTERM信号,收到信号后向Wine内的Python发送Windows终止指令:

#!/bin/bash
# 启动Wine Python脚本
wine python your_script.py &
WINE_PYTHON_PID=$!

# 捕获自身的SIGTERM,转发为Windows终止命令
trap 'echo "触发优雅终止..."; wine taskkill /im python.exe /t' SIGTERM

# 等待进程结束
wait $WINE_PYTHON_PID

给这个脚本发送SIGTERM时,会自动通知Wine内的Python执行清理并退出。


内容的提问来源于stack exchange,提问作者pavels

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:35:08