【问题标题】:Ctrl-C for quitting Python in Powershell now not working用于在 Powershell 中退出 Python 的 Ctrl-C 现在不起作用
【发布时间】:2017-06-21 17:01:26
【问题描述】:

在 Powershell/命令提示符中使用 Ctrl-C 时 Python 无法退出,而是给出一个“KeyboardInterrupt”字符串。

最近我重新安装了 Windows 10。在重新安装之前 Ctrl-C 退出 python (3.5/2.7) 很好,没有输出。

有人知道为什么会这样吗?是否只是简单的设置?

我能想到的唯一区别是我现在使用的是 python 3.6。 Ctrl-D 在 Windows 上的 Ubuntu 上的 Bash 中工作,而 Ctrl-C 在激活的 anaconda python2 环境中可以正常工作以退出 python。

【问题讨论】:

  • 我在运行 wsl 图像导出时也遇到了这种问题。我最终设法通过简单地关闭 Powershell 窗口来终止该进程。虽然它可能无法解决每个人的“Powershell 中的 Ctrl-C”问题,但它可能会对一些读者有所帮助。

标签: python powershell exit


【解决方案1】:

我在使用 Windows 10 Pro Build 18363 和 Python 3.8.1 时遇到了这个问题。我正在运行一些 python 脚本并且无法使用CTRL + C 停止一些脚本,但CTRL + BREAK 每次都有效。 The Windows Docs 有话要说:

CTRL+C 和 CTRL+BREAK 组合键接受控制台进程的特殊处理。默认情况下,当控制台窗口具有键盘焦点时,CTRL+C 或 CTRL+BREAK 被视为信号(SIGINT 或 SIGBREAK)而不是键盘输入...

CTRL+BREAK 始终被视为信号,但应用程序可以通过两种方式更改默认的 CTRL+C 行为,从而阻止调用处理函数:

  1. SetConsoleMode 函数可以禁用控制台输入缓冲区的 ENABLE_PROCESSED_INPUT 输入模式,因此 CTRL+C 报告为键盘输入而不是信号。
  2. 当调用 SetConsoleCtrlHandler 并为其参数设置 NULL 和 TRUE 值时,调用进程会忽略 CTRL+C 信号。通过使用 NULL 和 FALSE 值调用 SetConsoleCtrlHandler 来恢复正常的 CTRL+C 处理。这个忽略或不忽略 CTRL+C 信号的属性是由子进程继承的,但它可以被任何进程启用或禁用,而不影响现有进程。

因此,CTRL + C 似乎是一个 SIGINT,它的动作可以被你正在运行的程序修改。似乎 Windows 上的 Python 的编码方式是 CTRL + C 被处理为键盘输入,而不是我们期望的 SIGINT。对我来说幸运的是,我的键盘上有CTRL + BREAK 键,而且每次都有效。

对于那些键盘上没有BREAK 的人,您可以使用 Windows On Screen 虚拟键盘。

  1. win key + r打开运行应用程序。
  2. 输入osk然后按确定
  3. 在虚拟键盘上,按ctrl + ScrLk,这应该会终止程序。

如果ctrl + ScrLk 在虚拟键盘上不起作用,您可以尝试此stack thread 的其他方法。

【讨论】:

  • 就我而言,我的笔记本电脑键盘上没有中断键。所以我使用, Ctrl +Fn + B
【解决方案2】:

你可以输入

CTRL + Z, 

然后按 ENTER 从 powershell 退出 python。

Powershell Screenshot

【讨论】:

    【解决方案3】:

    这是最近出现在 Windows 10 Insider build 15002 中的错误。

    解决方法是将映射键从 Ctrl C 更改为 Ctrl K

    如果您不熟悉如何操作,可以查看或stty -a

    您可以在将 Terminate 映射到 Ctrl + K 的每个 bash 会话上运行此命令

    stty intr \^k
    

    作为 TEMP 解决方案,您可以将其包含在您的 Bashrc 中,以便在每个新会话上执行它

    此错误已在 Github #1569 上报告

    【讨论】:

    • 谢谢戴夫。我会调查一下。
    【解决方案4】:

    当您按下 Control C 时,会引发 KeyboardInterrupt 异常。如果它没有停止代码,最好的办法是在你的代码中添加一个try 语句来捕获KeyboardInterrupt

    try:
        ....
    
    except KeyboardInterrupt:
        exit()
    

    代码就在我的脑海中,如果出现问题,非常抱歉。

    编辑:Ctrl Break 或在某些键盘上Ctrl Pause 显然会立即停止 python 代码。

    【讨论】:

    • 感谢您的回答。但这与代码停止无关。这只是关于退出python。当我以前按Ctrl-C时,python正常退出,没有任何输出。为什么现在更改为仅提供 KeyboardInterrupt 的输出?我对这些东西并不擅长,所以为任何愚蠢的事情道歉。
    【解决方案5】:

    在 Windows-7 上,在运行 numpy 的 Spyder 中,对于 Python 3,点击键盘上角的 Esc 按钮似乎对我有用。+ 它打破了无限……:关于交互式脚本中的错误语法

    【讨论】:

      【解决方案6】:

      以前按Ctrl-C,python正常退出,没有任何输出。

      我真的不记得我什么时候可以用Ctrl + C 退出python。在我的记忆中,Ctrl + C 总是给我KeyboardInterrupt


      我也找不到解释为什么Ctrl + C 不能在 shell 中退出 python 的答案。仅供参考,Ctrl + DCtrl + \ 可以出于不同的原因退出 python。在此处查看@Gilles 的答案。 https://superuser.com/questions/169051/whats-the-difference-between-c-and-d-for-unix-mac-os-x-terminal


      但我认为如何处理Ctrl + C只是程序的决定。是的,我认为这完全取决于程序想要如何处理它。请看我下面写的例子。

      test.c

      #include <signal.h>
      #include <stdio.h>
      #include <unistd.h>
      
      static void ctrlC_Handler(int sig){
          if(sig == SIGINT){
              printf("(:KeyboardInterrupt:)\n");
              printf(">>>");
              signal(SIGINT, ctrlC_Handler);
          }
      }
      
      static void welcome(){
          printf("Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15)\n");
          printf("[GCC 7.3.0] on linux2\n");
          printf("Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n");
          printf(">>>");
          fflush(stdout);
      }
      
      int main(){
          welcome();
          signal(SIGINT, ctrlC_Handler);
      
          for(;;){
              pause();
          }
      
          return 0;
      }
      

      gcc test.c 编译它并执行它./a.out。试试按Ctrl + C,你至少可以看到它模仿了你输入Ctrl + C时python程序的行为(输出)。

      所以,在我看来,这没什么特别的,而是人类/程序员/作者决定如何处理它。

      【讨论】:

        【解决方案7】:

        在我的例子中,我发现 right ctrl + c 在 anaconda3 powershell 中可以解决问题 - 所以不需要重新映射 - 我在 Windows 10 上。

        【讨论】:

          【解决方案8】:

          这很神奇

          如果您有带 Fn 键的笔记本电脑,请点按:

          Ctrl + Fn + S
          

          来源: https://www.dell.com/community/Laptops-General-Read-Only/break-key-alternative/td-p/3826467

          【讨论】:

            猜你喜欢
            • 2017-07-03
            • 2017-04-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多