在 PyCharm 中调试代码时按下 Ctrl + C 时,我的 Python try/ except 循环似乎不会触发键盘中断。 (运行程序时使用 Ctrl + C 会出现同样的问题,但在 PyCharm Python 控制台中不会出现。)
我的代码如下所示:
try:
while loop:
print("busy")
except KeyboardInterrupt:
exit()
完整代码可以在这里查看。上面的代码会产生相同的错误。
我知道这是一个老问题,但我遇到了同样的问题,并认为有一个更简单的解决方案:
在 PyCharm 中,转到“运行”/“编辑配置”并选中“在输出控制台中模拟终端”。 PyCharm 现在接受键盘中断(确保控制台处于焦点状态)。
测试于: PyCharm 2019.1(社区版)
从您的屏幕截图来看,您似乎正在 IDE 中运行此代码。 IDE 的问题在于它们与正常运行不太一样,尤其是在处理键盘字符方面。您按下 ctrl-c 的方式,您的 IDE 认为您想要复制文本。 python 程序永远看不到该字符。也许它在运行时会弹出一个单独的窗口?然后你可以在 ctrl-c 之前选择该窗口。
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 中找到。
如果该评论不能解决您的问题,(来自@tdelaney)您需要将您的 shell 窗口聚焦(意味着您在程序运行时单击了它。)然后您可以使用 Control+C
如果您捕获到按下 Ctrl + C 时 PyCharm 引发的异常,您还可以使用 PyCharm 的 Python 控制台并使用 Ctrl + C。我在下面编写了一个名为
is_keyboard_interrupt
的简短函数,它告诉您异常是否是 KeyboardInterrupt,包括 PyCharm 的。如果不是,只需重新加注即可。我粘贴了下面代码的简化版本。
运行时:
注意:这不适用于 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!')
尝试 shift + control + C。这对我有用。
确保在按 ctrl+c 时选择该窗口。我刚刚在 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()
如果
当在 shell 中标记文本时,
只需取消标记文本并再次按
虽然这不是 Pycharm 解决方案,但我想提一下,如果您使用的是 Linux,只需将
SIGINT
和 kill -s SIGINT <pid>
发送到您的进程即可。当按下 SIGINT
时,shell 实际上会为您发送 ctrl-c
。
程序暂停时可以获取PID,只需在调试控制台中输入
os.getpid()
即可找到PID。或者你可以使用像htop
这样的系统工具来查找你的进程的PID。