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。
答案 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行为,以防止调用处理程序函数:
- SetConsoleMode函数可以为控制台的输入缓冲区禁用ENABLE_PROCESSED_INPUT输入模式,因此CTRL + C被报告为键盘输入而不是信号。
- 当使用参数的NULL和TRUE值调用SetConsoleCtrlHandler时,调用过程将忽略CTRL + C信号。通过使用NULL和FALSE值调用SetConsoleCtrlHandler,可以恢复正常的CTRL + C处理。忽略或不忽略CTRL + C信号的属性由子进程继承,但是任何进程都可以启用或禁用它,而不会影响现有进程。
因此,CTRL + C
似乎是一个SIGINT,可以通过您正在运行的程序来修改其动作。 Windows上的Python似乎已被编码为CTRL + C
被当作键盘输入而不是我们期望的SIGINT处理。对我来说幸运的是,我的键盘上有CTRL + BREAK
键,每次都能使用。
对于键盘上没有BREAK
的用户,可以使用Windows屏幕虚拟键盘。
win key + r
打开运行的应用程序。osk
,然后按确定ctrl + ScrLk
,这将终止程序。如果ctrl + ScrLk
在虚拟键盘上不起作用,您可以尝试使用此stack thread其他方法。
答案 1 :(得分:4)
答案 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 + D
和Ctrl + \
可以出于不同的原因退出python。在这里查看@Gilles的答案。 https://superuser.com/questions/169051/whats-the-difference-between-c-and-d-for-unix-mac-os-x-terminal
但是我认为如何处理Ctrl + 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