使用 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的主要内容,如果未能解决你的问题,请参考以下文章