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

问题描述 投票:0回答:10

在 PyCharm 中调试代码时按下 Ctrl + C 时,我的 Python try/ except 循环似乎不会触发键盘中断。 (运行程序时使用 Ctrl + C 会出现同样的问题,但在 PyCharm Python 控制台中不会出现。)

我的代码如下所示:

try:
    while loop:
        print("busy")

except KeyboardInterrupt:
    exit()

完整代码可以在这里查看。上面的代码会产生相同的错误。

python pycharm try-except keyboardinterrupt
10个回答
26
投票

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

在 PyCharm 中,转到“运行”/“编辑配置”并选中“在输出控制台中模拟终端”。 PyCharm 现在接受键盘中断(确保控制台处于焦点状态)。

测试于: PyCharm 2019.1(社区版)


13
投票

从您的屏幕截图来看,您似乎正在 IDE 中运行此代码。 IDE 的问题在于它们与正常运行不太一样,尤其是在处理键盘字符方面。您按下 ctrl-c 的方式,您的 IDE 认为您想要复制文本。 python 程序永远看不到该字符。也许它在运行时会弹出一个单独的窗口?然后你可以在 ctrl-c 之前选择该窗口。


5
投票

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 中找到。


2
投票

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


2
投票

如果您捕获到按下 Ctrl + C 时 PyCharm 引发的异常,您还可以使用 PyCharm 的 Python 控制台并使用 Ctrl + C。我在下面编写了一个名为

is_keyboard_interrupt
的简短函数,它告诉您异常是否是 KeyboardInterrupt,包括 PyCharm 的。如果不是,只需重新加注即可。我粘贴了下面代码的简化版本。

运行时:

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

注意:这不适用于 PyCharm 的调试器控制台(由“调试”而不是“运行”调用的控制台),但对 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!')

1
投票

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


0
投票

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


0
投票

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

0
投票

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

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

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


0
投票

虽然这不是 Pycharm 解决方案,但我想提一下,如果您使用的是 Linux,只需将

SIGINT
kill -s SIGINT <pid>
发送到您的进程即可。当按下
SIGINT
时,shell 实际上会为您发送
ctrl-c

程序暂停时可以获取PID,只需在调试控制台中输入

os.getpid()
即可找到PID。或者你可以使用像
htop
这样的系统工具来查找你的进程的PID。

© www.soinside.com 2019 - 2024. All rights reserved.