Windows Python解释器在Ctrl + C上退出

时间:2017-04-05 10:11:12

标签: python windows windows-console

对于我使用过的大多数Python解释器,Ctrl + C将使解释器打印出“KeyboardInterrupt”并保持打开状态。但是,在最近在新计算机上安装时,Ctrl + C导致解释器退出,这是不可取的。

  • 设置signal.SIGINT处理程序仍然退出。
  • 没有可以调整行为的启动脚本。
  • raise KeyboardInterrupt不会退出解释器。
  • Ctrl + C上没有文字。在Ctrl + Break上,退出前会发出^C

如果我在下面的代码段中的暂停期间按Ctrl + C,则解释程序将保持打开状态。

import time

try:
    time.sleep(100)
except KeyboardInterrupt:
    pass

环境:Windows 10上的Python 3.4.3

1 个答案:

答案 0 :(得分:4)

在Windows 8及更高版本上运行3.6之前的Python版本的shell提示符处,Ctrl + C处理已中断。对于inputraw_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打印它。