克隆一个活跃的ipython内核?

时间:2013-07-05 13:55:24

标签: python ipython

假设您打开了ipythonqt shell,并且shell正在运行脚本。有没有办法实时克隆shell(即打开另一个ipython shell,使其包含当前与第一个shell /内核的内存状态相关联的所有对象的副本)?此(以及其他内容)的目的是允许检查原始shell在运行其脚本时所取得的进度。感谢。

2 个答案:

答案 0 :(得分:1)

克隆正在运行的进程的标准机制称为分叉。但是,按照这种方式进行交互式处理可能是一条痛苦的道路。

在我看来,实现起来非常简单的方法是在你的python脚本中创建一个新线程(使用threading标准包),该线程包含对交互式shell的调用(沿{{1行) }或import code; code.interact(local=locals()))。但是,您必须知道,当您的交互式shell正在运行时,由于GIL,您的主线程将无法运行。

尽管如此,您最好还是实施某种基于时间的监控而不是这种解决方案。有点像:

import pdb; pdb.set_trace()

if loop_number % 1000 == 0:
    print(x)

答案 1 :(得分:1)

IPython是围绕具有多个控制台的解释器内核而设计的。当我开始

ipython console

它在横幅文字中报告:

[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-6795.json

所以在另一个shell中我运行ipython console --existing kernel-6795.json然后可以键入一个shell

pid = os.getpid()

在另一个shell中:

print pid

没有得到NameError。由于我以前从未使用过这个功能,所以我确实看过它是如何实现的:有两个ipython但只有一个python的实例。实际上,os.getpid()在两个shell中都给出了相同的PID。

但是:如果一个shell正在运行代码,则第二个shell将阻塞,直到第一个shell返回到命令提示符。我不知道更多事件驱动的ipython qtconsole如何处理这个问题。