为什么这个 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。它对我有用。
我的 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。它对我有用。