2

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

4

2 回答 2

2

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处理这个。

于 2013-07-05T15:17:02.293 回答
2

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

在我看来,实现起来非常简单的是threading在你的 python 脚本中创建一个新线程(使用标准包),其中包含对交互式 shell 的调用(沿着import code; code.interact(local=locals())or的行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()
于 2013-07-05T14:27:08.277 回答