【问题标题】:Preventing SIGQUIT from terminating interactive python防止 SIGQUIT 终止交互式 python
【发布时间】:2014-01-21 10:29:52
【问题描述】:

按键 Ctrl + \ 导致 python 和 ipython 核心转储并立即退出。我怎样才能防止这种情况?我不想禁用该键或重新映射键盘。

我最近使用了英式键盘,而我习惯于在 Enter 键上方使用的反斜杠/竖线键现在位于左移键和 Z 键之间。我发现我经常碰到 SIGQUIT 的键盘快捷键,并且从交互式解释器中丢失了所有变量。

【问题讨论】:

    标签: python signals ipython core coredump


    【解决方案1】:

    看来您是在 *nix 平台上。 Ctrl\ 生成 SIGQUIT,所以这与 Python 无关。

    如果你想禁用组合键,你可以在启动 Python 之前使用stty

    stty quit undef
    

    或者,使用以下命令运行 Python:

    stty quit undef; python; stty quit ^\\
    

    这将在执行 python 之前禁用键映射并稍后将其设置回来。

    【讨论】:

    • 谢谢,完美运行。语法 ^\\ 是什么意思?
    • @wim 本质上将SIGQUIT 映射到Ctrl+\。您需要转义反斜杠本身。
    【解决方案2】:

    涉及信号处理程序的答案不能解决 IPython 5 及更高版本的问题,因为 Ctrl-\ 绑定现在在应用程序级别显式处理(这与从 readline 迁移到提示工具包有关)。

    要为较新版本的 IPython(在 IPython 5.3 上测试)禁用 Ctrl-\,请使用 startup files 禁用该绑定:

    from IPython.terminal.shortcuts import force_exit
    from IPython import get_ipython
    ip = get_ipython()
    ip.pt_cli.application.key_bindings_registry.remove_binding(force_exit)
    

    【讨论】:

      【解决方案3】:

      您可以使用signal 模块并为SIGQUIT 信号设置处理程序:

      import signal
      
      def handler(signum, frame):
          print("SIGQUIT")
      
      signal.signal(signal.SIGQUIT, handler)
      

      并将此代码添加到 IPython startup files

      【讨论】:

      • 我应该提到,这是我目前的解决方案。我认为这感觉很糟糕,因为它阻止我运行实际上出于正当原因确实依赖 SIGQUIT 的代码。
      • 从 IPython 5 开始,这不再有效。 Ctrl-\ 绑定是硬编码的。
      猜你喜欢
      • 2017-07-14
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多