Python睡眠函数不捕捉中断信号

Python睡眠函数不捕捉中断信号,python,Python,我无法捕获主线程中的INT信号,请告诉我如何解决该问题。我希望sleep方法可以被CTRL+C中断,但它会等到计时器结束 import pygtk pygtk.require('2.0') import gtk import time import urllib2 import re import signal import sys import __main__ from time import ctime, strftime, localtime from threading impo

我无法捕获主线程中的INT信号,请告诉我如何解决该问题。我希望sleep方法可以被CTRL+C中断,但它会等到计时器结束

import pygtk
pygtk.require('2.0')

import gtk
import time
import urllib2
import re
import signal
import sys

import __main__

from time import ctime, strftime, localtime
from threading import Thread

myThread = None

class MyThread(Thread):

    def __init__(self, filename):
        Thread.__init__(self)
        self.filename = filename;
        self.terminate = False

    def StopProcess(self):
        self.terminate = True

    def run(self):
        while self.terminate <> True:
            time.sleep(5)
            self.terminate = True

def SignalHandler(signum, frame):
    if (myThread <> None):
        myThread.StopProcess()
    sys.exit()

if __name__ == "__main__":

    signal.signal(signal.SIGINT, SignalHandler)

    myThread = MyThread("aaa")
    myThread.start()
导入pygtk
pygtk.require('2.0')
进口gtk
导入时间
导入urllib2
进口稀土
输入信号
导入系统
导入主__
从时间导入ctime、strftime、localtime
从线程导入线程
myThread=无
类MyThread(线程):
def uuu init uuu(self,文件名):
线程。\uuuu初始化\uuuuu(自)
self.filename=文件名;
self.terminate=False
def停止进程(自身):
self.terminate=True
def运行(自):
当self.terminate为True时:
时间。睡眠(5)
self.terminate=True
def信号处理器(信号,帧):
如果(读取无):
myThread.StopProcess()
sys.exit()
如果名称=“\uuuuu main\uuuuuuuu”:
signal.signal(signal.SIGINT,SignalHandler)
myThread=myThread(“aaa”)
myThread.start()

信号仅传送到一个线程。仅第一个线程或第一个可用线程,具体取决于操作系统


您必须实现自己的逻辑来关闭其他线程,或者使它们成为守护进程线程,这样它们就不会阻止进程退出。

信不信由你,这将起作用

from Queue import Queue, Empty
def signal_safe_sleep(delay):
  q = Queue()
  try: q.get(True, delay)
  except Empty: pass

或者,您可以使用os.pipe()创建一些文件描述符,然后在signal\u safe\u sleep函数中对它们使用select.select()。这两种方法都允许在signal\u safe\u sleep返回之前调用Python信号处理程序。

同样,我只是用你的代码片段更改了time.sleep函数,脚本仍然不响应ctrl+c并等待5秒。对,只有当你的主线程是调用signal\u safe\u sleep的线程时,这才有效,因为主线程是获取^C的线程。在代码中,当SIGTERM出现时,主解释器线程已经在其关闭例程中(加入所有非守护进程线程)。我不确定你的SignalHandler函数在这种情况下是否被调用。是的,你是对的,主线程末尾的signal.pause()完成了它。谢谢标准行为是捕获SIGINT并将其转换为KeyboardInterrupt异常。我很好奇是否有一个原因,仅仅捕获该异常是不够的?