【发布时间】: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来实现的。
标签: python python-3.x windows ipython spyder