很遗憾,没有简单的方法来做到这一点。您需要使用 psutil
和 signal
模块。要使其工作,您需要安装 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
的解释器。您可以检查:
请确保已正确设置解释器:
如果您尚未安装 psutil
,可以通过点击 Install 按钮进行安装。
好的,既然我们已经准备就绪了,让我们调试程序:
现在我们只需要获取进程 ID,我们可以在程序的开头获取它:
然后,让我们启动控制台并发送信号:
如果一切正常,您应该看到 while 循环结束:
您可以通过为控制台的起始脚本添加一个发送中断的函数来进一步简化该过程:
完成所有这些后,您只需要调用 interrupt(<pid here>)
来在进程上调用键盘中断。
希望这回答了您的问题。
这是PyCharm中的一个错误。请参见:http://youtrack.jetbrains.com/issue/PY-4840
键盘中断是SIGINT。在Unix系统中,您可以进入命令行并执行以下操作:
$ kill -INT <pid>
或者用python:
import os, signal
os.kill(<pid>,signal.SIGINT)
如此评论所述 - 为什么这个Python键盘中断不起作用?(在PyCharm中):
在最近的PyCharm版本中,您可以在运行配置中启用
在输出控制台中模拟终端
,这允许在运行控制台中使用Ctrl + C 发送键盘中断。
已在PyCharm 2018.3 (社区版)中测试:
此外,这将会破坏tqdm库:我在搜索Pycharm的bug跟踪问题时发现了这条消息: https://youtrack.jetbrains.com/issue/PY-4840
如果您正在使用Pycharm 3版本,这可能会有所帮助,对我有效。
在跟踪器中的一条评论: “我实际上发现Ctrl+C最终会停止运行脚本,但您必须在其运行时首先在控制台中写入一个字母。因此,单击控制台窗口,按下任意键,然后按Ctrl-C。换句话说,它看起来像是GUI框架获取焦点的问题。”