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

ita*_*ita 5 python windows windows-console

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

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

如果在以下代码片段的打sn过程中按Ctrl + C,则解释器将保持打开状态。

import time

try:
    time.sleep(100)
except KeyboardInterrupt:
    pass
Run Code Online (Sandbox Code Playgroud)

环境:Windows 10上的Python 3.4.3

Ery*_*Sun 5

在 Windows 8 及更高版本上运行时,对于 3.6 之前的 Python 版本,Ctrl+C 处理在 shell 提示符下被破坏。它也被破坏了inputand raw_input,你会得到一个EOFError而不是一个KeyboardInterrupt。您可以通过安装和启用win_unicode_console- 或升级到 3.6来解决此问题

问题在于,当读取被 Ctrl+C 中断时,Python 用于从控制台读取的旧代码取决于ReadFile将最后一个错误设置为ERROR_OPERATION_ABORTED(995)。在 Windows 8 中,Microsoft 完全重写了客户端进程与控制台通信的方式。这样做,他们违反了ReadFile在这种情况下的行为的书面合同。如果没有错误,Python 认为中止的读取是成功读取 0 字节。通常这表示文件结束 ( EOF),因此 REPL 只是简单地退出,就像用户输入了 Ctrl+Z、Enter 一样。

ReadFile是从任何文件句柄的通用读取。还有一个专门的ReadConsole功能。这个仍然表现正确,这就是为什么win_unicode_console3.6+ 没有这个问题。他们调用ReadConsoleW来解决在控制台中使用全系列Unicode的单独问题,而这恰好也解决了Ctrl + C问题。


仅供参考,^C您在屏幕上看到的不是由控制台 (conhost.exe) 或 Python 编写的。它实际上是CTRL_BREAK_EVENT由 cmd.exe shell 设置的处理程序打印的。如果您从 PowerShell 运行 Python,您不应看到使用 Ctrl+Break 打印的内容。