>设置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
问题是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打印的内容.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。