python - Windows 中的信号处理

标签 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 'My process Id' , os.getpid()

while True:
    print 'Waiting for signal'
    time.sleep(10)

当这个进程运行时,我只是将 SIGINT 从其他一些 python 进程发送到这个进程,

os.kill(pid,SIGINT)

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

有人可以帮我解决这个问题吗。这是 Windows 中的限制吗,因为在 Linux 中同样可以正常工作。

提前致谢。

最佳答案

当您按下 CTRL+C 时,进程会收到一个 SIGINT 并且您正在正确地捕获它,否则它会抛出一个 KeyboardInterrupt 错误。

在 Windows 上,当 time.sleep(10) 被中断时,尽管您捕获到 SIGINT,它仍然会抛出一个 InterruptedError。只需在 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。

关于python - Windows 中的信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26061814/

相关文章:

python - 如何在 PyOpenGL 中面向对象进行击退?

python - 使用 pyplot 在不等轴上绘制圆

windows - 为什么 "go get gopkg.in/..."不工作而 "go get github.com/..."正常?

python - CSV 阅读器在 Ubuntu 和 Windows 上的不同输出 - Python

python - 如何递归地压平嵌套字典?

python - pyvenv 安装了错误的 pip 版本

python - 如何在 Windows 7 的虚拟环境中运行 py 文件?

windows - 什么是子类化和 API Hook ?

c++ - MS Visual Studio Professional 2013 - C++ 为 32 位和 64 位操作系统编译单个可执行文件?

python - 为什么 Django 1.9 将设置和 URL 中的 tuples () 替换为列表 []?