将Ipython嵌入到PyQt4应用程序中

时间:2013-05-24 14:26:13

标签: python qt pyqt4 ipython

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

所以,我需要嵌入Python,我需要它存在于我的PyQt4应用程序中,这样我就可以用我的Python App中的数据来改变内核的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()

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

修改

13.2没有inprocess-kernel功能。你仍然需要开发分支。是什么驱使我问这个问题并不是我更新了我的开发分支,但是在我的机器上更新QT / PyQt4让现有的代码破坏了。我随后更新了Ipython开发版本,该版本要求我在API发生变化时重构我的代码。

2 个答案:

答案 0 :(得分:2)

我走了同样的道路,但最终使用了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()

答案 1 :(得分:0)

这是我已经制作并且一直用于PyQt4和PySide应用QIPythonWidget的东西。我没有在IPython上做任何工作,我只是砍掉了它,所以可能有一个更好的方法,但这可以工作,并没有遇到问题。希望它有所帮助。