3

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

因此,我需要嵌入 Python,并且我需要它存在于我的 PyQt4 应用程序中,这样我就可以user_ns使用来自我的 Python 应用程序的数据来更改内核。用于从 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 没有进程内内核功能。您仍然需要开发分支。驱使我问这个问题的不是我更新了我的开发分支,而是更新我机器上的 QT/PyQt4 使现有代码中断。我随后更新了 Ipython 开发版本,该版本要求我在 API 发生变化时重构我的代码。

4

2 回答 2

2

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

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

在开发 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()
于 2013-05-24T15:13:08.003 回答
0

这是我制作并一直在使用 PyQt4 和 PySide 应用程序QIPythonWidget的东西。我没有在 IPython 上做任何工作,我只是对它进行了破解,所以可能有更好的方法来做这件事,但这很有效,并且没有遇到问题。希望能帮助到你。

于 2013-05-26T01:20:15.067 回答