gpt4 book ai didi

python - 将 Ipython 嵌入到 PyQt4 应用程序中

转载 作者:行者123 更新时间:2023-11-28 17:46:58 24 4
gpt4 key购买 nike

我在 PyQt4 应用程序处于测试阶段时将 Python 嵌入到它中,并且只在 Ipython 的一个 git 分支上工作。我已经有一年左右没有查看代码了,从那以后发生了很多变化——Ipython 中似乎有很多重构。我目前安装了 13.2

因此,我需要嵌入 Python,我需要它存在于我的 PyQt4 应用程序中,这样我就可以使用来 self 的 Python 应用程序的数据更改内核的 user_ns。用于从 git 对付 python 版本的代码如下:

import sys
sys.path.insert(0, "../../ipython") #pickup ipython from git in a nonstd dir

from IPython.embedded.ipkernel import EmbeddedKernel
from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget
from IPython.frontend.qt.embedded_kernelmanager import QtEmbeddedKernelManager
from IPython.lib import guisupport
from PyQt4.QtGui import QFrame,QHBoxLayout
from PyQt4.QtGui import QApplication
from collections import namedtuple



class IpythonEmbeddedWidget(QFrame):
def __init__(self):
QFrame.__init__(self)
self._layout = QHBoxLayout()
self._kernel = EmbeddedKernel()
self._kernel_manager = QtEmbeddedKernelManager(kernel = self._kernel)
self._kernel_manager.start_channels()
self._kernel.frontends.append(self._kernel_manager)
self._shell_widget = RichIPythonWidget()
app = guisupport.get_app_qt4()
self._shell_widget.exit_requested.connect(app.quit)
self._shell_widget.kernel_manager = self._kernel_manager
self._layout.addWidget(self._shell_widget)
self.setLayout(self._layout)
self._kernel.shell.run_cell("import nltk")
self._kernel.shell.run_cell("import sys")
self._kernel.shell.run_cell("sys.path.append('../ipython_scripts')")
self._kernel.shell.run_cell("cd ../ipython_scripts")


def set_shell_focus(self):
pass

if __name__ == '__main__':
app = QApplication(sys.argv)
iew = IpythonEmbeddedWidget()
iew.show()
app.exec_()
sys.exit()

那么,我需要更改什么才能让它与当前 (13.2) 版本的 Ipython 一起工作?

编辑:

13.2 没有 inprocess-kernel 功能。您仍然需要开发分支。促使我问这个问题的不是我更新了我的开发分支,而是在我的机器上更新 QT/PyQt4 导致现有代码中断。我随后更新了 Ipython 开发版本,这要求我在 API 发生变化时重构我的代码。

最佳答案

我走了同样的路,但最终使用了 IPython dev,因为嵌入解决方案更干净并且没有讨厌的 input()/help() 错误。

这是 0.13.x 的解决方法:https://stackoverflow.com/a/12375397/532513 -- 问题是,例如,如果您使用 help(),一切都会卡住。

在开发IPython中,一切都简单多了。这是一个工作示例:

from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget
from IPython.frontend.qt.inprocess import QtInProcessKernelManager
from IPython.lib import guisupport
from PyQt4.QtGui import QApplication

app = QApplication(sys.argv)

kernel_manager = QtInProcessKernelManager()
kernel_manager.start_kernel()
kernel = kernel_manager.kernel
kernel.gui = 'qt4'

kernel_client = kernel_manager.client()
kernel_client.start_channels()

def stop():
kernel_client.stop_channels()
kernel_manager.shutdown_kernel()
# here you should exit your application with a suitable call
sys.exit()

widget = RichIPythonWidget()
widget.kernel_manager = kernel_manager
widget.kernel_client = kernel_client
widget.exit_requested.connect(stop)
widget.setWindowTitle("IPython shell")

ipython_widget = widget
ipython_widget.show()

app.exec_()
sys.exit()

关于python - 将 Ipython 嵌入到 PyQt4 应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16737323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com