为什么这个 python 键盘中断不起作用? (在pycharm)

Why doesn't this python keyboard interrupt work? (in pycharm)

我的 python try/except 循环似乎在调试我在 pycharm 中的代码时按下 Ctrl + C 时不会触发键盘中断。我的代码如下所示:

try:
    while loop:
        print("busy")

except KeyboardInterrupt:
    exit()

编辑: 我的精简代码似乎存在一些问题,但没有产生相同的错误。完整代码可以查看here。我也重新精简了代码(上面的代码),它产生了同样的错误。

如果该评论不能解决您的问题,(来自@tdelaney)您需要关注 shell window(这意味着您在程序 运行.) 然后你可以使用 Control+C

确保在按 ctrl+c 时选择了 window。我刚刚 运行 你的程序在 IDLE 中,它对我来说工作得很好。

这里工作正常,因为我在您的代码中放置了一个变量 "x",并且我使用 tabs 而不是 spaces

try:

    def help():
        print("Help.")

    def doStuff():
        print("Doing Stuff")

    while True:
        x = int(input())
        if x == 1:
            help()
        elif x == 2:
            doStuff()
        else:
            exit()

except KeyboardInterrupt:
    exit()

从您的屏幕截图看来,您是 运行 此代码在 IDE 中。关于 IDEs 的事情是它们通常与 运行 不太一样,尤其是在处理键盘字符时。您按 ctrl-c 的方式,您的 IDE 认为您想要复制文本。 python 程序永远不会看到该字符。也许它会在 运行 时单独显示一个 window?然后你会 select 在 ctrl-c 之前 window。

我知道这是一个老问题,但我 运行 遇到了同样的问题并认为有一个更简单的解决方案:

在 PyCharm 中转到 "Run"/"Edit Configurations" 并检查 "Emulate terminal in output console"。 PyCharm 现在接受键盘中断(确保控制台处于焦点状态)。

测试于: PyCharm2019.1(社区版)

您还可以使用 PyCharm 的 Python 控制台并使用 Ctrl + C,如果您捕捉到 PyCharm 在按下 Ctrl + C 时引发的异常。我在下面写了一个简短的函数,叫做 is_keyboard_interrupt 告诉你异常是否是 KeyboardInterrupt,包括 PyCharm 的。如果不是,只需重新加注。我在下面粘贴了代码的简化版本。

当运行:

  • 键入 'help' 并按 Enter 键重复循环。
  • 键入任何其他内容并按 Enter 以检查是否正确处理了 ValueError。
  • 按 Ctrl + C 检查是否捕获了 KeyboardInterrupt,包括在 PyCharm 的 python 控制台中。

注意:这不适用于 PyCharm 的调试器控制台(由 "Debug" 而不是 "Run" 调用的控制台),但需要使用 Ctrl + C更少,因为您只需按下暂停按钮即可。

我也把它放在我的要点上,我可以在那里进行更新:https://gist.github.com/yulkang/14da861b271576a9eb1fa0f905351b97

def is_keyboard_interrupt(exception):
    # The second condition is necessary for it to work with the stop button
    # in PyCharm Python console.
    return (type(exception) is KeyboardInterrupt
            or type(exception).__name__ == 'KeyboardInterruptException')

try:
    def print_help():
        print("To exit type exit or Ctrl + c can be used at any time")
    print_help()

    while True:
        task = input("What do you want to do? Type \"help\" for help:- ")
        if task == 'help':
            print_help()
        else:
            print("Invalid input.")

            # to check that ValueError is handled separately
            raise ValueError()

except Exception as ex:
    try:
        # Catch all exceptions and test if it is KeyboardInterrupt, native or
        # PyCharm's.
        if not is_keyboard_interrupt(ex):
            raise ex

        print('KeyboardInterrupt caught as expected.')
        print('Exception type: %s' % type(ex).__name__)
        exit()

    except ValueError:
        print('ValueError!')

PyCharm 的 Python 控制台在 Ctrl-C 而不是 KeyboardInterrupt 上引发异常 console_thrift.KeyboardInterruptException。异常 console_thrift.KeyboardInterruptException 不是 KeyboardInterrupt 的子类,因此未被行 except KeyboardInterrupt.

捕获

添加以下行将使您的脚本与 PyCharm.

兼容
try:
    from console_thrift import KeyboardInterruptException as KeyboardInterrupt
except ImportError:
    pass

这不会破坏与 运行 终端或其他 IDE 脚本的兼容性,例如 IDLE 或 Spyder,因为模块 console_thrift 仅在 [=26] 中找到=].

如果 没有停止程序,一个可能的原因是:

当在 shell 中标记文本时, 被解释为“将标记的文本复制到剪贴板”。

只需取消标记文本并再次按

试试 shift + control + C。它对我有用。