【问题标题】:Why is KeyboardInterrupt not working in python?为什么 KeyboardInterrupt 在 python 中不起作用?
【发布时间】:2009-02-12 21:53:42
【问题描述】:

为什么像下面这样的代码不能捕获 CTRL-C?

MAXVAL = 10000
STEP_INTERVAL = 10

for i in range(1, MAXVAL, STEP_INTERVAL):
    try:
        print str(i)
    except KeyboardInterrupt:
        break

print "done"

我的期望是——如果在程序运行时按下 CTRL-C,KeyboardInterrupt 应该退出循环。它没有。

对我做错了什么有帮助吗?

【问题讨论】:

  • 它适用于 Windows,Python 2.5
  • 你没有告诉我们发生了什么!是忽略中断还是停止程序而不打印“完成”?

标签: python


【解决方案1】:

听起来程序在按下 control-c 时已经完成,但是您的操作系统还没有完成向您显示所有输出。 .

【讨论】:

    【解决方案2】:

    代码流程如下:

    1. for 从列表中获取新对象(由range 生成)并将i 设置为它
    2. try
    3. print
    4. 返回1

    如果您在第 1 部分中按 CTRL-C,则它位于 try/except 之外,因此不会捕获异常。

    试试这个:

    MaxVal = 10000
    StepInterval = 10
    
    try:
        for i in range(1, MaxVal, StepInterval):
            print i
    except KeyboardInterrupt:
        pass
    
    print "done"
    

    【讨论】:

    • 我认为 print("done") 应该在 except 块内完成,否则您的代码似乎没有遵循非常好的实践 imo。异常绝不应该只是通过
    • @J.C.Rocamonde 在此特定代码中,OP 希望忽略 CTRL-C,并在所有情况下打印“完成”。如果我将print 语句放在except 子句中,那么它将仅在按 ctrl-c 时打印,而不是在 for 循环正常完成时打印。异常可能只是pass,当它们被预期时,你只想忽略它,而不做任何事情。这是一种有效的方法,只要您知道自己忽略了什么。我会说裸 except 而不指定异常类是不好的,但 pass 很好。
    • 是的,你是对的;打印应该是不管的。我有错误的印象(不知道为什么)循环是无限的。很抱歉抱怨:)
    【解决方案3】:

    我遇到了同样的问题,我刚刚找到了解决方案:

    您正在像 PyCharm 这样的 IDE 中运行此代码。 IDE 将 ctrl+c(键盘中断)作为副本。尝试在终端中运行您的代码。

    【讨论】:

    • 你这么说是因为?很好的尝试只是猜测他正在使用 IDE。它可以在交互式控制台中运行,也可以在终端中运行...
    • 或者问题可能取决于 IDE,如果这确实是问题,
    • 我知道这篇文章有些陈旧,但我提高了这一点,因为我遇到了这个确切的问题并且这个解决方案有所帮助。终端修复了它。
    【解决方案4】:

    有效。

    我使用的是 Ubuntu Linux,你呢? 使用 MaxVal = 10000000 之类的东西再次测试它

    【讨论】:

    • 我明白了。在 Pythonwin(Python IDE)中运行时不会中断。如果从命令行调用它会完全中断。所以看起来这是 Pythonwin 的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 2021-07-01
    • 2023-03-24
    • 1970-01-01
    • 2017-06-17
    • 2013-04-25
    • 2018-04-21
    • 2011-03-03
    相关资源
    最近更新 更多