在IPython中,扩展可以处理内核中断吗?

在IPython中,扩展可以处理内核中断吗?,ipython,Ipython,我正在用cell magics编写一个IPython扩展,它通过pexpect调用另一个可执行文件。它使这个可执行文件在内核的生命周期中一直在后台运行。是否在某个地方有一个钩子,以便在引发内核中断时(例如,IPython笔记本中的“中断内核”菜单选项),我可以发送此子进程Ctrl-C)作为答案重新发布: IPython通过发送SIGINT来中断内核,该信号与在终端中按Ctrl-C时触发的信号相同。因此,只要您想在自己的代码运行时捕获它,您就可以捕获键盘中断,如下所示: p.sendline('s

我正在用cell magics编写一个IPython扩展,它通过
pexpect
调用另一个可执行文件。它使这个可执行文件在内核的生命周期中一直在后台运行。是否在某个地方有一个钩子,以便在引发内核中断时(例如,IPython笔记本中的“中断内核”菜单选项),我可以发送此子进程
Ctrl-C

作为答案重新发布:

IPython通过发送SIGINT来中断内核,该信号与在终端中按Ctrl-C时触发的信号相同。因此,只要您想在自己的代码运行时捕获它,您就可以捕获
键盘中断
,如下所示:

p.sendline('some命令')
尝试:
p、 预期(处理完成标记)
除键盘中断外:
p、 sendintr()

您是否在控制一个单元中的子进程,当您想中断它时,该子进程仍在执行?还是从后台线程?或者您刚刚创建了pexpect对象并继续执行其他操作。“停止”按钮是指中断菜单选项,还是仪表板上的内核关闭按钮?@ThomasK我不确定你评论的第一部分是什么意思,但我想我是在做第一个选项。扩展在IPython加载子进程时启动子进程,然后cell magic实现发送行并从中读取输出。这发生在调用cell magic的同一个线程上。您希望它在内核关闭时停止,还是仅仅中断?这些是不同的事情-在中断内核后,您可以继续使用它,但在关闭它之后,内核进程就消失了。@ThomasK我只想在内核中断时将
Ctrl-C
发送到子进程。子进程是另一种语言的解释器,只要我能把信号传给它,它就会做正确的事情。关闭内核已经做了正确的事情;我只是希望人们能够摆脱他们可能在代码中编写的任何无限循环,而不必重新启动一切:)那么这是在你的cell magic运行时发生的吗?如果是这样,您应该能够在Python函数中捕获
KeyboardInterrupt
,然后使用
p.sendintr()
向子进程发送中断。