Python PySide应用程序在启动时使用~/.config/autostart运行时,在关机期间似乎忽略了SIGTERM

Python PySide应用程序在启动时使用~/.config/autostart运行时,在关机期间似乎忽略了SIGTERM,python,linux,qt,ubuntu,pyside,Python,Linux,Qt,Ubuntu,Pyside,我的PySide应用程序似乎忽略了Linux上关机时发送的术语信号,因为它是通过在~/.config/autostart中输入一个条目自动启动的 通过以下实验,我得出结论,问题在于PySide/Qt 首先,我创建了一个简单的Python脚本,它捕获术语信号并打印确认,然后退出。这是代码 import signal import sys import time def on_quit(*args): print 'here', args sys.exit(0) for i in [x

我的PySide应用程序似乎忽略了Linux上关机时发送的术语信号,因为它是通过在~/.config/autostart中输入一个条目自动启动的

通过以下实验,我得出结论,问题在于PySide/Qt

首先,我创建了一个简单的Python脚本,它捕获术语信号并打印确认,然后退出。这是代码

import signal
import sys
import time

def on_quit(*args):
  print 'here', args
  sys.exit(0)

for i in [x for x in dir(signal) if x.startswith('SIG')]:
  try:
    signum = getattr(signal, i)
    if i == 'SIGCHILD' or i == 'SIGCHLD':
      continue
    signal.signal(signum, on_quit)
  except Exception, m:
    print 'Skipping %s' % i

time.sleep(1000000)
for循环只在所有可能的信号上注册on_quit方法

在终端中调用它并通过杀死它来发送术语信号,我可以确认脚本正在捕获和处理它

然后,我尝试在启动时通过在~/.config/autostart中包含一个条目来运行这个脚本。该条目类似于以下内容:

[Desktop Entry]
Version=1.0
Type=Application
Name=Test
GenericName=Test
Comment=Test
Exec=strace -T -f -tt -o run_test.strace run_test
Terminal=false
StartupNotify=false
我使用strace跟踪脚本的系统调用,以另一种方式确认它正在捕获术语信号。strace的选项告诉它包括在系统调用上花费的时间、遵循forks、以微秒打印一天中的时间,并按此顺序将输出发送到run_test.strace

run_test只是一个调用Python脚本的bash脚本;之所以包括它,是因为我最初的PySide应用程序就是这样被调用的。其代码为:

#!/bin/bash
python test.py &>out.test
我继续测试它,将桌面条目添加到~/.config/autostart,重新启动计算机,然后关闭它。run_test.strace包含一行——SIGTERM终止于@0——它确认SIGTERM已被发送和捕获。test还包含进一步确认它的预期输出

然后,我尝试用信号处理测试一个简单的PySide应用程序。代码如下

import signal
import sys
import time
from PySide.QtGui import QApplication
from PySide.QtCore import QTimer

app = QApplication([])
timer = QTimer()
timer.start(500)
timer.timeout.connect(lambda: None)

def on_quit(*args):
  print 'here', args
  sys.exit(0)

for i in [x for x in dir(signal) if x.startswith('SIG')]:
  try:
    signum = getattr(signal, i)
    if i == 'SIGCHILD' or i == 'SIGCHLD':
      continue
    signal.signal(signum, on_quit)
  except Exception, m:
    print 'Skipping %s' % i

app.exec_()
QTimer对于允许信号处理程序执行至关重要

在终端中运行上述脚本并向其发送术语信号,输出仍然确认正在捕获和处理术语信号。通过strace运行它还显示了一行--SIGTERM终止于@0--

然而,当在启动期间运行它时,输出显示没有调用on_quit方法,strace输出中也没有指示发送了术语信号

有人能帮忙吗?如果需要,我可以提供strace输出。系统是Ubuntu 12.04 32位

编辑:进一步的实验表明,QApplication会发生这种情况,但QCoreApplication不会。那可能是GUI相关的东西