假设您打开了一个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
是如何处理这一问题的。