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