当我处于测试阶段时,我将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发生变化时重构我的代码。
答案 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上做任何工作,我只是砍掉了它,所以可能有一个更好的方法,但这可以工作,并没有遇到问题。希望它有所帮助。