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

我试图在我的应用程序中嵌入一个I
Python 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()或连接文件丢失之前运行,我不知道如何管理它.

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

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

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

点赞