PyCharm调试模式下的键盘中断

34
有没有办法在PyCharm IDE(3.1)的调试模式下发送键盘中断事件?

我需要同样的东西。我需要能够优雅地停止脚本,并使用处理代码来使用CTRL-C或类似功能,而不仅仅是使用停止按钮。 - fantabolous
显然不是这样的:请查看并投票支持此链接,虽然它是针对CLion的,但如果在那里进行更改,似乎也会影响PyCharm。 - drevicko
请注意,在最近的版本中,大红正方形会发送SIGINT信号,等待一秒钟,然后发送SIGTERM信号。如果您的清理足够快,则可能适用于您。 - drevicko
6个回答

23

很遗憾,没有简单的方法来做到这一点。您需要使用 psutilsignal 模块。要使其工作,您需要安装 psutil,最好的方法是通过 pip 进行安装:

pip install psutil

所以,假设我们在这里有一个展品A:

while True:
    try:
        time.sleep(3)
        print "Zzzz"
        time.sleep(3)
        print("gong!")
    except KeyboardInterrupt as e:
        print "Closed by an Interrupt"
        break

在 PyCharm 中运行此程序时,请确保您正在使用已安装 psutil 的解释器。您可以检查:

enter image description here

请确保已正确设置解释器:

enter image description here

如果您尚未安装 psutil,可以通过点击 Install 按钮进行安装。

好的,既然我们已经准备就绪了,让我们调试程序:

enter image description here

现在我们只需要获取进程 ID,我们可以在程序的开头获取它:

enter image description here

然后,让我们启动控制台并发送信号:

enter image description here

如果一切正常,您应该看到 while 循环结束:

enter image description here

您可以通过为控制台的起始脚本添加一个发送中断的函数来进一步简化该过程:

enter image description here

完成所有这些后,您只需要调用 interrupt(<pid here>) 来在进程上调用键盘中断。

希望这回答了您的问题。


1
谢谢!这确实是一个答案。希望Jetbrains在未来的版本中能够提供更方便的方法。 - arbulgazar
很高兴你喜欢它。但是在PyCharm上这相当繁琐,希望能够快速解决。 - Games Brainiac
有没有办法在启动脚本中获取PID?在打印大量输出的应用程序中,启动后半小时后你无法查看控制台日志的开头。 - Pastafarianist
@Pastafarianist 我不知道是否有一个,所以这是一个错误。 - Games Brainiac
非常感谢,没有人能够期望得到比这更详细的答案! - Ofer

13

现在,PyCharm的“停止”按钮在调试模式和运行模式下都发送SIGINT信号。如果SIGINT无法终止程序,则“停止”按钮将其信号更改为SIGKILL。同时,它也会将其图标更改为骷髅头形状:

查看停止按钮如何更改其图标


有没有想法如何始终发送SIGKILL信号?每次尝试停止调试时都会出现小骷髅,这相当烦人。 - MikeyE
@MikeyE 默认发送SIGKILL是一个不好的想法。这可能会让子进程运行并避免清理。无论如何,如果你还是决定需要它,你可以尝试关闭程序(十字按钮,即Ctrl+F4)。 - milaniez
这可能不是一个好主意,但如果进程无法停止,PyCharm默认会这样做。在我的情况下,每次我按停止按钮时都是如此。也许发送不同的信号会更好。但无论如何,在PyCharm中如何实现呢? - MikeyE
2
@milaniez 你知道这个功能是在哪个版本中引入的吗?在我的 Mac 上似乎发送了 SIGINT,但是在 Windows PyCharm 2017.1.5 中,无论是调试模式还是运行模式,程序都会立即终止。 - wlnirvana
请注意,在发送SIGKILL信号之前会有一秒的延迟。如果清理需要更长时间,那么就没办法了。不过,向进程发送SIGINT信号(可以使用终端或者像GamesBraniac回答中提到的psutils)也可以起到作用。 - drevicko

12

这是PyCharm中的一个错误。请参见:http://youtrack.jetbrains.com/issue/PY-4840

键盘中断是SIGINT。在Unix系统中,您可以进入命令行并执行以下操作:

$ kill -INT <pid>

或者用python:

import os, signal
os.kill(<pid>,signal.SIGINT)

1
PyCharm的错误已被关闭并修复 - 正在尝试重新打开。 - Mark
这里有一个简单而好的解决方案,这个答案需要更多的赞。 - David Parks
请注意(并投票支持!)https://youtrack.jetbrains.com/issue/CPP-3067?_ga=2.210591317.1550189038.1594127255-2002604257.1583301113...针对CLion的问题,但显然如果在那里进行更改,它也会影响PyCharm。 - drevicko

9

5

我在搜索Pycharm的bug跟踪问题时发现了这条消息: https://youtrack.jetbrains.com/issue/PY-4840

如果您正在使用Pycharm 3版本,这可能会有所帮助,对我有效。

在跟踪器中的一条评论: “我实际上发现Ctrl+C最终会停止运行脚本,但您必须在其运行时首先在控制台中写入一个字母。因此,单击控制台窗口,按下任意键,然后按Ctrl-C。换句话说,它看起来像是GUI框架获取焦点的问题。”


1
这在PyCharm 2019.3.1(社区版)中无法工作。 - Comrade Che
这在科学模式下起到了作用,版本为2020.3.4。 - user6715080

0
听起来有点傻,但这对我有用。 退出PyCharm并从查找器中删除.idea文件夹,然后重新启动PyCharm。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接