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