如何在将现有对象传递到该控制台的同时在我的应用程序中生成IPython qtconsole

时间:2013-01-17 10:01:40

标签: multithreading multiprocessing ipython qtconsole

我试图在我的应用程序中嵌入一个IPython qtconsole,类似于我可以嵌入一个IPython文本控制台,因此:

from IPython.frontend.terminal.embed import InteractiveShellEmbed
myobj={'jason':10}
shell = InteractiveShellEmbed()
shell.user_ns = myobj
shell()

我可以使用

在我的应用程序中启动QT控制台
from IPython.frontend.qt.console.qtconsoleapp import IPythonQtConsoleApp
app = IPythonQtConsoleApp()
app.initialize()
app.start()

但是这无法访问现有对象。

我可以在我的应用程序中启动一个可以访问现有对象的内核,使用:

import IPython
myobj={'jason':10}
IPython.embed_kernel(local_ns=myobj)
#No more code executes

然后使用

连接到它
ipython qtconsole --existing

或者,在另一个python脚本中:

from IPython.lib.kernel import find_connection_file
from IPython.frontend.qt.console.qtconsoleapp import IPythonQtConsoleApp

cf=find_connection_file("*")
app = IPythonQtConsoleApp(existing=cf[-1])
app.initialize()
app.start()

但这些不是单一的解决方案,都需要另一个shell。内核在一个不产生的线程中运行,因此在内核存在之前不再执行代码。

所以,我的问题是,如何在一个脚本中实现上述目标?

我尝试使用线程和多处理,但由于 embed_kernel()永远不会返回,显然必须在 IPythonQTConsoleApp()之前运行,否则连接文件将丢失,我不知道如何管理它。

P.S。如果某人的代表大于1000,请添加一个qtconsole标签。

1 个答案:

答案 0 :(得分:2)

要在不阻塞的情况下嵌入内核,请查看IPython存储库中的this example。 IPython知道一些巧妙的技巧,可以将自己与Qt事件循环集成,因此您可以同时运行控制台和应用程序。对于交互式调试这样的事情,这是可行的方法。

如果您需要将控制台嵌入到您自己的应用程序中,我们just merged是一个进程内核。看看this example。在下一个版本发布之前,您需要使用IPython开发版本,但是进行一些早期测试会很棒。