Python Windows下的信号处理

Python Windows下的信号处理,python,windows,python-2.7,python-3.x,signals,Python,Windows,Python 2.7,Python 3.x,Signals,在Windows中,我试图创建一个等待SIGINT信号的python进程。当它收到SIGINT信号时,我希望它只打印一条消息,并等待SIGINT的再次出现。因此,我使用了信号处理程序 这是我的signal_receiver.py代码 import signal, os, time def handler(signum, frame): print 'Yes , Received', signum signal.signal(signal.SIGINT, handler) print

在Windows中,我试图创建一个等待SIGINT信号的python进程。当它收到SIGINT信号时,我希望它只打印一条消息,并等待SIGINT的再次出现。因此,我使用了信号处理程序

这是我的signal_receiver.py代码

import signal, os, time

def handler(signum, frame):
    print 'Yes , Received', signum

signal.signal(signal.SIGINT, handler)
print 'My process Id' , os.getpid()

while True:
    print 'Waiting for signal'
    time.sleep(10)
当这个进程运行时,我只是使用

os.kill(pid,SIGINT)

但是,当signal_receiver.py接收到SIGINT时,它只是退出执行。但预期的行为是在处理函数中打印消息并继续执行

有人能帮我解决这个问题吗?这在windows中是一个限制吗?因为在linux中同样适用


提前感谢。

当您按下CTRL+C时,进程将收到一个SIGINT,您将正确捕获它,因为否则它将抛出一个
键盘中断
错误

在Windows上,当
time.sleep(10)
被中断时,虽然您捕获了SIGINT,但它仍会抛出
interruptederError
。只需在time.sleep内添加try/except语句即可捕获此异常,例如:

import signal
import os
import time

def handler(signum, frame):
    if signum == signal.SIGINT:
        print('Signal received')

if __name__ == '__main__':
    print('My PID: ', os.getpid())
    signal.signal(signal.SIGINT, handler)

    while True:
        print('Waiting for signal')
        try:
            time.sleep(5)
        except InterruptedError:
            pass

注意:在Python3.x上测试,它也应该在2.x上工作。

Windows没有信号。Python正在为您模拟它们,但可能不支持跨进程这样做。考虑使用本地IPC方法之一。Python不支持跨进程信号。@wap26只需将
interruptederError
替换为
IOError
,就可以了。我在运行Windows 10的联想笔记本电脑上用Python 3.8.6测试了您的示例。没有抛出异常。处理程序函数运行以响应键入ctrl-c。然后,在编程的5秒钟后,睡眠完成。键入ctrl-fn-b通过SIGBREAK终止程序,并发出^C消息。我进一步修改了您的示例,以便在SIGBREAK和SIGINT上打印消息。它可以工作,但是SIGBREAK消息延迟到睡眠完成,而SIGINT消息在睡眠期间打印。另外,现在我必须转到另一个窗口来终止进程。