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

svujldwt  于 2022-11-08  发布在  PyCharm
关注(0)|答案(9)|浏览(384)

在PyCharm中调试代码时,当按下Ctrl + C时,Python的try/except循环似乎没有触发键盘中断(在运行程序时使用Ctrl + C也会发生同样的问题,但在PyCharm Python控制台中不会发生)。
我的代码看起来像这样:

try:
    while loop:
        print("busy")

except KeyboardInterrupt:
    exit()

完整的代码可以在here中查看。上面的代码也会产生同样的错误。

tzcvj98z

tzcvj98z1#

我知道这是一个老问题,但我遇到了同样的问题,并认为有一个更容易的解决方案:
在PyCharm中,转到“运行”/“编辑配置”并选中“在输出控制台中仿真终端”。PyCharm现在接受键盘中断(确保控制台被聚焦)。
测试日期:PyCharm 2019.1(社区版)

cs7cruho

cs7cruho2#

从屏幕截图中可以看出,您正在IDE中运行这段代码。IDE的特点是它们与正常运行时不太一样,尤其是在处理键盘字符方面。按ctrl-c的方式,你的IDE认为你想复制文本。2 python程序从来没有看到过这个字符。3也许它在运行时会带出一个单独的窗口?然后,在按ctrl-c之前选择该窗口。

bjp0bcyl

bjp0bcyl3#

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

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

u5rb5r59

u5rb5r594#

如果该注解不能解决您的问题,(来自@tdelaney)您需要聚焦shell窗口(意味着您在程序运行时单击了它),然后可以使用Control+C

7fyelxc5

7fyelxc55#

你也可以使用PyCharm的Python控制台和使用Ctrl + C,如果你在按下Ctrl + C时捕捉到PyCharm引发的异常。我在下面写了一个名为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!')
mrwjdhj3

mrwjdhj36#

这里是正常工作,因为我把一个变量“x”在你的代码,我用 * 制表符 * 而不是 * 空格 *。

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()
q8l4jmvw

q8l4jmvw7#

试试shift + control + C。我用的很好。

ipakzgxi

ipakzgxi8#

当你按下ctrl+c的时候,确保窗口被选中。我刚刚在IDLE中运行了你的程序,它对我来说非常好。

gjmwrych

gjmwrych9#

如果〈Strg+C〉不能停止程序,一个可能的原因是:
当一个文本在shell中被标记时,〈Strg+C〉被解释为“将标记的文本复制到剪贴板”。
只需取消文本标记并再次按〈Strg+C〉即可。

相关问题