用于在Powershell中退出Python的Ctrl-C现在无法正常工作

时间:2017-02-04 10:24:35

标签: python powershell exit

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

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

有谁知道为什么会这样开始?它是否只是一个简单的设置?

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

8 个答案:

答案 0 :(得分:7)

我在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. 当使用参数的NULL和TRUE值调用SetConsoleCtrlHandler时,调用过程将忽略CTRL + C信号。通过使用NULL和FALSE值调用SetConsoleCtrlHandler,可以恢复正常的CTRL + C处理。忽略或不忽略CTRL + C信号的属性由子进程继承,但是任何进程都可以启用或禁用它,而不会影响现有进程。

因此,CTRL + C似乎是一个SIGINT,可以通过您正在运行的程序来修改其动作。 Windows上的Python似乎已被编码为CTRL + C被当作键盘输入而不是我们期望的SIGINT处理。对我来说幸运的是,我的键盘上有CTRL + BREAK键,每次都能使用。

对于键盘上没有BREAK的用户,可以使用Windows屏幕虚拟键盘。

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

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

答案 1 :(得分:4)

您可以输入

CTRL + Z, 

然后按Enter键以从powershell退出python。

Powershell Screenshot

答案 2 :(得分:0)

按Control C时,会抛出KeyboardInterrupt异常。如果它没有停止代码,那么最好的做法是在代码中添加try语句,以捕获KeyboardInterrupt

try:
    ....

except KeyboardInterrupt:
    exit()

代码只是我的头脑,所以如果出了什么问题就很抱歉。

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

答案 3 :(得分:0)

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

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

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

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

stty intr \^k

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

此错误已在Github#1569上报告

答案 4 :(得分:0)

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

答案 5 :(得分:0)

  

当我过去按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程序的行为(输出)。

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

答案 6 :(得分:0)

以我为例,我发现正确的ctrl + c 在anaconda3 powershell中可以解决问题-因此无需重新映射-我在Windows 10上。

答案 7 :(得分:0)

那就像魔术一样

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

Ctrl + Fn + S

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