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

Posted

技术标签:

【中文标题】如何在我的应用程序中生成 IPython qtconsole,同时将现有对象传递到该控制台【英文标题】:How can I spawn an IPython qtconsole within my app while passing existing objects to that console 【发布时间】:2013-01-17 10:01:40 【问题描述】:

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

【问题讨论】:

还有ipython - Provide remote shell for Python script - Stack Overflow (background-zmq-ipython Python 包,在单独的线程中运行) // 另见:python - Embedding IPython Qt console in a PyQt application - Stack Overflow 【参考方案1】:

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

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

【讨论】:

您指向的示例已移动或更改或两者兼而有之。我看到github.com/ipython/ipython/blob/master/examples/Embedding/… 并猜想这适用于最新版本,但我不知道它可以追溯到多远。它在 IPython 0.13.2 中不起作用,并且该版本的任何提示在更新的答案中也将非常有用。特别是如果它在 pygtk 中工作。谢谢! @nealmcb 谢谢,我已经更新了这些链接。我不知道他们的工作有多远,但你可以查看examples in the 0.13 branch。 Qt和Wx都有例子,所以应该可以适配Gtk。 酷 - 谢谢 - 现在对我来说效果很好。剩下的一点魔力似乎是如何在 0.13 中干净地关闭一个 gtk 应用程序,在通过 ipkernel.start() 让它运行之后。调用 gtk.main.quit() 并没有解决问题,关闭窗口甚至在控制台中输入“退出”也没有,所以我现在求助于 sys.exit().... 如何将 IPython 内核嵌入到不使用 Qt 等 GUI 事件循环的应用程序中?例如,一个 WSGI 应用程序? 您需要将 IPython 事件循环与该应用程序中运行的任何事件循环集成。我认为我们没有任何与 Web 服务器事件循环集成的示例,但 this doc section 应该是相关的。

以上是关于如何在我的应用程序中生成 IPython qtconsole,同时将现有对象传递到该控制台的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的案例中生成数据特征,以便我可以使用 LinearRegression 等工具进行预测?

循环,从数组中生成带有函数的按钮

我应该如何处理默认助手或 twitterBootstrap 助手在我的 Play 2 应用程序中生成的 html 输出

当您的应用程序在前台时,如何在 ios 10 中生成本地通知?当您的应用程序在前台时,它就不起作用

为啥 echo 语句没有在我的 PHP 代码中生成任何内容?

如何在 Qt 应用程序中生成按键事件到系统(win7)(模拟用户在键盘上按键)?