对于我使用过的大多数Python解释器,Ctrl + C将使解释器打印出“KeyboardInterrupt
”并保持打开状态。但是,在最近在新计算机上安装时,Ctrl + C导致解释器退出,这是不可取的。
signal.SIGINT
处理程序仍然退出。raise KeyboardInterrupt
不会退出解释器。^C
。如果我在下面的代码段中的暂停期间按Ctrl + C,则解释程序将保持打开状态。
import time
try:
time.sleep(100)
except KeyboardInterrupt:
pass
环境:Windows 10上的Python 3.4.3
答案 0 :(得分:4)
在Windows 8及更高版本上运行3.6之前的Python版本的shell提示符处,Ctrl + C处理已中断。对于input
和raw_input
,它也会被破坏,您将获得EOFError
而不是KeyboardInterrupt
。您可以通过安装和启用win_unicode_console
或升级到3.6
问题在于,从控制台读取的Python旧代码取决于ReadFile
在读取被Ctrl + C中断时将最后一个错误设置为ERROR_OPERATION_ABORTED
(995)。在Windows 8中,Microsoft完全重写了客户端进程如何与控制台通信。在这种情况下,他们打破了ReadFile
在这种情况下行为的记录合同。没有错误,Python认为中止读取是0字节的成功读取。通常这表示文件结束(EOF
),因此REPL只是退出,就像用户键入了Ctrl + Z,Enter一样。
ReadFile
是来自任何File句柄的通用读取。还有一个专门的ReadConsole
函数。这个仍然表现正常,这就是win_unicode_console
和3.6+没有这个问题的原因。他们调用ReadConsoleW
来解决在控制台中使用全范围Unicode的单独问题,这恰好也解决了Ctrl + C问题。
仅供参考,您在屏幕上看到的^C
不是由控制台(conhost.exe)或Python编写的。它实际上是由cmd.exe shell设置的CTRL_BREAK_EVENT
处理程序打印的。如果从PowerShell运行Python,则不应该看到使用Ctrl + Break打印它。