使用 Spyder 3.3 无法在 input() 中捕获 Ctrl+C

Posted

技术标签:

【中文标题】使用 Spyder 3.3 无法在 input() 中捕获 Ctrl+C【英文标题】:Can't catch Ctrl+C in input() with Spyder 3.3 【发布时间】:2019-10-20 22:06:34 【问题描述】:

如何在用户输入时捕获 Ctrl+C 并退出程序。我在具有 8 GB RAM 的 Windows 64 位机器上的 spyder 3.3.3 上的 IPython 7.4.0 上使用 Python 3.7.3。

最重要的是,当我在 windows powershell 上运行这个程序时,它可以工作,这只会发生在 spyder 上。

我尝试使用线程、KeyboardInterrupt 等,但没有任何效果。我也看到了很多关于这个的帖子,但没有一个有用。问题是每次python都无法捕获Ctrl + C。

while True:
    line = input()
    if ('line contains Ctrl+C')
        break
    print(line)

print("Exiting")

我希望在按下 Ctrl + C 后,程序会打印“Exiting”并停止执行。

【问题讨论】:

通常有两种方法来处理输入终止:第一种是使用 sentinel 输入,例如一个无效的值(例如-1 输入正数时);第二个是让用户按下“文件结尾”键盘组合(Windows 上为Ctrl-Z,Linux 或 macOS 上为Ctrl-D)并检测到。 当您从 PowerShell 运行脚本时,python.exe 进程会继承控制台。否则不涉及 PowerShell。您可以从快捷方式或 Win+R 对话框运行 python.exe,结果相同。当用户按下 Ctrl+C 时,控制台中的熟读会生成一个控制事件。此事件由 Python 的 C 运行时库通过调用 Python 的信号处理程序来处理,这反过来又中断主线程(如果可能)以调用 SIGINT 处理程序,该处理程序默认为引发 KeyboardInterrupt 的函数。在 IDE 中,必须模拟 Ctrl+C,如果它甚至受支持的话。 我不知道 Spyder 是做什么的,但是在 Python 附带的基本 IDE IDLE 中,Ctrl+C 是通过在子 python.exe 进程中调用 _thread.interrupt_main 来实现的。 【参考方案1】:

主要的事情是当你按下 Ctrl+C 时会发生什么。它只是停止。话虽如此,您也许可以排除KeyboardInterrupt。你试过吗?

import sys

try:
    #Code Stuff Goes Here
except KeyboardInterrupt:
    print(Exiting...)
    sys.exit()

【讨论】:

是的,我尝试使用它仍然冻结,我必须重新启动内核

以上是关于使用 Spyder 3.3 无法在 input() 中捕获 Ctrl+C的主要内容,如果未能解决你的问题,请参考以下文章

无法在 spyder 上导入 sklearn

win下opencv为啥在spyder上运行不了了

如何在 spyder 中向控制台提供多行输入

无法更新 Anaconda Spyder

在 Windows 10 上 Pip 安装 Spyder(无法启动)

安装itorch之后出现spyder无法使用