4

我试图在我的应用程序中嵌入一个 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()

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

所以,我的问题是,我怎样才能在一个脚本中实现上述目标?

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

4

1 回答 1

2

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

如果您需要将控制台嵌入到您自己的应用程序中,我们刚刚合并了一个进程内内核。看看这个例子。在下一个版本之前,您需要使用 IPython 开发版本,但进行一些早期测试会很棒。

于 2013-01-17T13:07:29.147 回答