克隆活动的ipython内核



假设您打开了一个ipythonqt shell,该shell正在运行一个脚本。有没有一种方法可以实时克隆shell(即打开另一个ipython shell,使其包含当前与第一个shell/内核的内存状态相关联的所有对象的副本)?这样做(除其他外)的目的是允许检查原始shell在运行其脚本时所取得的进展。谢谢

克隆正在运行的进程的标准机制称为分叉。但是,按照你所描述的方式,以互动的方式走这条路可能会是一条痛苦的路。

在我看来,实现起来非常简单的是在python脚本中创建一个新线程(使用threading标准包),该线程包含对交互式shell的调用(沿着import code; code.interact(local=locals())import pdb; pdb.set_trace()的行)。您必须知道,尽管交互式shell正在积极工作,但由于GIL的原因,您的主线程不会运行。

不过,您可能会更好地实现某种基于时间的监控,而不是这种解决方案。大致如下:

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

import time
timestamp = 0
[...]
if timestamp + 5 < time.time()
    print(x)
    timestamp = time.time()

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()

在另一个外壳中:

print pid

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

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

最新更新