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

时间:2016-09-30 17:12:12

标签: python pycharm try-except keyboardinterrupt

在调试pycharm中的代码时,如果按下Ctrl + C,我的python try / except循环似乎不会触发键盘中断。我的代码看起来像这样:

numbers = []
loop = True

try: 
    # ===========SUBROUTINES==================

    def help():
        print("To view the list type 'view'"
              "\n To add an item type 'add'"
              "\n To remove an item type 'remove'"
              "\n To exit type exit or Ctrl + c can be used at any time")

    # =========SUBROUTENES END===============


    while loop:
        task = input("What do you want to do? Type \"help\" for help:- ")
        if task == 'help':
            help()
        else:
            print("Invalid return please try again.")

    except KeyboardInterrupt:
        exit()

编辑:我的瘦身代码工作似乎存在一些问题而且没有产生同样的错误。可以查看完整代码here。我还重新删除了代码(上面的代码),它产生了同样的错误。

9 个答案:

答案 0 :(得分:11)

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

在PyCharm中,转到“运行” /“编辑配置”,然后选中“在输出控制台中仿真终端”。 PyCharm现在可以接受键盘中断(请确保控制台聚焦)。

经过以下测试: PyCharm 2019.1(社区版)

答案 1 :(得分:4)

在屏幕截图中,您似乎在IDE中运行此代码。关于IDE的事情是它们与正常运行并不完全相同,尤其是在处理键盘字符时。按ctrl-c的方式,IDE认为您要复制文本。 python程序永远不会看到角色。 Pehaps它在运行时会显示一个单独的窗口?然后你可以在ctrl-c之前选择那个窗口。

答案 2 :(得分:3)

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

添加以下行将使您的脚本与PyCharm兼容。

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

这不会破坏在终端或其他IDLE或Spyder等IDE中运行脚本的兼容性,因为模块console_thrift仅在PyCharm中找到。

答案 3 :(得分:2)

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

运行时:

  • 键入“帮助”,然后按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!')

答案 4 :(得分:1)

如果该评论无法解决您的问题,(来自@tdelaney)您需要关注您的shell窗口(意味着您在程序运行时点击它。)然后您可以使用 Control + C

答案 5 :(得分:1)

按ctrl + c确保选中该窗口。我刚刚在IDLE中运行你的程序,它对我来说很有效。

答案 6 :(得分:1)

这是正常工作,因为我在你的代码中放了一个变量“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()

答案 7 :(得分:1)

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

答案 8 :(得分:0)

不停止程序的一个可能原因:

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

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