将 Python SIGINT 重置为默认信号处理程序

2024-03-12

版本信息:

  • 操作系统:Windows 7
  • Python版本3.3.5

下面是我正在玩的一小段测试代码。目的是忽略CTRL-C在执行某些代码时按下,之后CTRL-C行为将会恢复。

import signal 
import time

try:
    # marker 1
    print('No signal handler modifications yet')
    print('Sleeping...')
    time.sleep(10)

    # marker 2
    signal.signal(signal.SIGINT, signal.SIG_IGN)
    print('Now ignoring CTRL-C')
    print('Sleeping...')
    time.sleep(10)

    # marker 3
    print('Returning control to default signal handler')
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    print('Sleeping...')
    time.sleep(10)

except KeyboardInterrupt:
    print('Ha, you pressed CTRL-C!')

我在玩这个时观察到的:

  • CTRL-C之间发送marker 1 and marker 2将由异常处理程序处理(如预期)。
  • CTRL-C之间发送marker 2 and marker 3被忽略(仍然如预期)
  • CTRL-C之后发送marker 3已处理但会not跳转到异常处理程序。相反,Python 只是立即终止.

另外,请考虑一下:

>>>import signal

>>>signal.getsignal(signal.SIGINT)
<built-in function default_int_handler>

>>> signal.getsignal(signal.SIGINT) is signal.SIG_DFL
False

>>> signal.signal(signal.SIGINT, signal.SIG_DFL)
<built-in function default_int_handler>

>>> signal.getsignal(signal.SIGINT) is signal.SIG_DFL
True

因此,最初,虽然信号处理程序被认为是默认信号处理程序,但它似乎是与定义的处理程序不同的处理程序SIG_DFL.

如果有人可以阐明这一点,特别是在将信号处理程序恢复到 SIG_DFL 后忽略异常处理程序时。


Python安装自己的SIGINT处理程序以提高KeyboardInterrupt例外情况。将信号设置为SIG_DFL不会恢复该处理程序,而是恢复系统本身的“标准”处理程序(它终止解释器)。

您必须存储原始处理程序并在完成后恢复该处理程序:

original_sigint_handler = signal.getsignal(signal.SIGINT)

# Then, later...
signal.signal(signal.SIGINT, original_sigint_handler)

正如kindall在评论中正确地说的那样,你可以将其表达为上下文管理器 https://docs.python.org/3.4/library/contextlib.html:

from contextlib import contextmanager

@contextmanager
def sigint_ignored():
    original_sigint_handler = signal.getsignal(signal.SIGINT)
    signal.signal(signal.SIGINT, signal.SIG_IGN)
    try:
        print('Now ignoring CTRL-C')
        yield
    except:
        raise  # Exception is dropped if we don't reraise it.
    finally:
        print('Returning control to default signal handler')
        signal.signal(signal.SIGINT, original_sigint_handler)

你可以这样使用它:

# marker 1
print('No signal handler modifications yet')
print('Sleeping...')
time.sleep(10)

# marker 2
with sigint_ignored():
    print('Sleeping...')
    time.sleep(10)

# marker 3
print('Sleeping...')
time.sleep(10)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Python SIGINT 重置为默认信号处理程序 的相关文章

随机推荐

  • 现在 x86 上有多少指令? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 仅使用套接字的 Python 邮件客户端(无 smtplib)

    我正在尝试编写一个 python 程序 它将在不使用 smtplib 的情况下发送电子邮件 我尝试查看有关此问题的其他帖子 但找不到解决方案 from socket import msg r n My email s content end
  • Spring MVC 项目无法发布和运行...消息:无法自省注释

    我有一个 Spring MVC 应用程序 4 1 1 发布版本 当我尝试发布并在服务器上运行时 我收到以下错误 附加信息 使用Spring工具套件3 6 1 春季版本 4 1 1 RELEASE 这是一个maven项目 它没有任何编译错误
  • OCMock - 部分模拟 [UIAlertView alloc]

    我有一个问题OCMockiOS 框架 我本质上是想嘲笑UIAlertView s initWithTitle message delegate 方法 下面的示例不起作用 因为当我调用时 未返回存根返回值initWithTitle metho
  • 使用 Gson 2.3.1 反序列化包含在 Java 中不起作用的接口的 Json 字符串

    我正在尝试使用 Gson 将包含接口和哈希图 具有接口类型和包含接口类型的列表 的 json 字符串反序列化为 java 对象 但我越来越 java lang RuntimeException 无法调用接口 com abc Dummy 的无
  • R - 使用匹配运算符时保留顺序 (%in%)

    我正在使用匹配运算符从单独的数据框中获取矩阵中出现的值 但是 生成的矩阵的值按照它们在数据框中出现的顺序排列 而不是按原始矩阵排列 有没有办法使用匹配运算符来保留原始矩阵的顺序 这是一个简单的例子 vec c b a c vec df da
  • jQuery 克隆表行

    我有一个表 末尾有一个 添加 按钮 当您单击此按钮时 我希望在当前行下方创建一个新的表行 我还希望该行的输入字段为空 我尝试使用 clone 来执行此操作 但它会克隆页面上的所有行 请帮忙 谢谢 Script input tr clone
  • 位置侦听器从服务工作,但不是 IntentService

    我有一个应用程序 我试图定期获取用户位置并将其发送到服务器 我有一项服务附加到AlarmManager每分钟执行一次 用于测试 该服务正确找到用户位置并注销 GPS 坐标 一旦出现 GPS 锁定 我就会取消位置请求并停止服务 当我请求位置更
  • C++ 2D 曲面细分库?

    我有一些凸多边形存储为点的 STL 向量 或多或少 我想要镶嵌 http en wikipedia org wiki Tesselate它们非常快 最好分成大小相当均匀的块 并且没有 条子 我将用它来将一些物体分解成小碎片 有谁知道一个很好
  • 如何使用线程在java中暂停执行

    我以编程方式创建了一个向导 它包含 3 个面板 第二个是devicePane 第三个是detailsPane 第三个面板包含一个进度条 我希望我的程序启动一个功能process 显示第三个面板后 可以使用线程吗 else if Parser
  • HTML+CSS 中的不确定进度条

    我想创建一个不确定的HTML CSS进度条所以它看起来像 Vista 上的那个 source microsoft com http i msdn microsoft com dynimg IC121865 png 我想 水平调整进度条宽度
  • 在同一终端中同时运行多个命令

    I want to run a few commands each of which doesn t quit until Ctrl C is pressed Is there something I can run to run all
  • 客户愤怒,与未知的 DLL 依赖项作斗争

    我是一位为客户开发 C Windows 应用程序的单人秀 在过去的几个月里 我们一直遇到同样的问题 即客户计算机上缺少 DLL 依赖项 尽管我尽了最大努力 但问题仍然存在 我们收到了愤怒的电子邮件 我的老板和我老板的老板对我很生气 顾客也不
  • 如何在 Swift 中将*正数*转换为数字数组

    我想转换一个positive数字到相应的数字列表中 数字也应该是整数 转换时 例如 1024 它应该返回 1 0 2 4 在 Swift 4 1 或更高版本中 let number 1024 let digits String number
  • 部署时使 Google Cloud Function 的 Firebase 缓存失效

    我最近使用 Cloud Functions 和 Firebase Hosting 实现了 SSR 当 JS 包构建时 它会收到一个缓存突发后缀 main 1 js 在我的函数内部 我有以下代码段用于缓存云函数的结果 res set Cach
  • winapi 中子窗口编辑控件上的 WS_TABSTOP

    在我的 WinAPI 应用程序中 我的子窗口中有一系列编辑控件 我希望用户能够通过按 Tab 键前进并按 Shift Tab 键返回来在它们之间移动 但我似乎不知道如何使用WS TABSTOP与子窗口 我想要发生的是 当用户单击 Tab 键
  • 将 HTML 元素的引用传递给自定义挂钩

    假设我有一个自定义挂钩 我将使用它来将单击事件侦听器添加到 HTML 元素中 我创建参考const buttonRef useRef null 因此第一次渲染时的值为 null ref 值仅在渲染方法的final 中分配 此时我的自定义钩子
  • 最低权限的身份服务器无法在 Azure 上正常工作

    我正在尝试实现一个遵循 OAUTH2 OIDC 协议的架构 为了做到这一点 我为客户端提供了 STS Identity Server v3 ASP NET WebApi 和 ASP NET MVC 应用程序 我的目标是将 STS 和 RES
  • 如何获取目录中的目录列表,如 list.files(),但改为“list.dirs()”

    我能够使用list files 获取给定目录中的文件列表 但如果我想获取目录列表 我该怎么做 它是否就在我面前作为一个选项list files 另外 我使用的是 Windows 所以如果答案是使用某些 Linux unix 命令 那对我来说
  • 将 Python SIGINT 重置为默认信号处理程序

    版本信息 操作系统 Windows 7 Python版本3 3 5 下面是我正在玩的一小段测试代码 目的是忽略CTRL C在执行某些代码时按下 之后CTRL C行为将会恢复 import signal import time try mar