【发布时间】:2016-07-21 01:16:42
【问题描述】:
我正在尝试循环执行某些操作(在此示例中打印为 100)并随时按“Ctrl+C”取消计数。
我正在使用的测试代码如下,但这不起作用(编辑:它在从终端启动的脚本中工作,但在我的 IDE 的 python shell 中运行时不起作用 - Wing 101)。 KeyboardInterrupt 没有捕捉到“Ctrl+C”命令或任何其他键。
import time
i = 1
while (i < 101):
try:
print '%d percent complete' % i
time.sleep(0.5)
i += 1
except KeyboardInterrupt:
break
我已经阅读了这个问题here,我很确定这不是我的问题,因为我已经输入了“time.sleep(0.5)”命令来减慢程序的速度。我也读过this question,但既然它已经 5 岁了,我认为这个错误现在已经修复了吗?我知道我可以使用线程来实现我想要的,但如果只是为了学习我想知道为什么这种方法不起作用。
我在 Ubuntu 14.04 中使用 python 2.7.6,如果能提供解决此问题的任何帮助或建议,我将不胜感激。 (编辑:我知道代码是独立工作的,但我仍然想知道为什么它在 Wing 101 IDE 的 python shell 中不起作用)
编辑 1
按照建议,我已尝试将 while 循环放入 try 块中:
try:
i = 1
while (i < 101):
print '%d percent complete' % i
time.sleep(0.5)
i += 1
except KeyboardInterrupt:
break
但不幸的是,这也不起作用,而是出现以下错误:
Traceback (most recent call last):
File "/home/matt/autosys_repo1/python_test_scripts/test_refresh_line.py", line 13, in <module>
break
'break' outside loop: <string>, line 13
【问题讨论】:
-
您的方法与您链接的第一个线程中的答案之间存在差异。这家伙建议将循环语句放在 try 块中。您在 try/except 之外有 while 语句。你试过这样做吗?编辑:我试过你的代码,它按预期工作。
-
感谢@Brnpzs 的建议。不幸的是,这也不起作用(见编辑 1)。是的,它似乎对其他人有用,所以我很困惑为什么它对我不起作用。我觉得它只是我忽略的一些小细节。
-
break 在while循环外没有意义,可以使用sys.exit(0)强制退出。为此,您需要先导入 sys 模块。
-
恐怕也不行。它只是继续打印并且永远不会退出循环,直到 i = 100。我认为关键问题是 KeyboardInterrupt 无法识别按键。
-
解决此问题的另一种方法是使用 signal handlers ,在这种情况下,您要处理 SIGINT ,如this 问题的答案所示。
标签: python python-2.7 keyboardinterrupt wing-ide