导入错误将IPython嵌入到PyQt应用程序中

时间:2014-03-10 21:17:48

标签: python qt python-2.7 pyqt4 ipython

我有一个功能齐全的基于PyQt4的应用程序,我现在正试图将一个IPython控制台嵌入到一个脚本环境中。

我大致调整了IPython's Github page中的示例以适应我的应用程序的模块系统。但是,如果任何 PyQt导入在IPython导入之前发生

from IPython.qt.console.rich_ipython_widget import RichIPythonWidget
from IPython.qt.inprocess import QtInProcessKernelManager

我收到以下错误:

ImportError: 
Could not load requested Qt binding. Please ensure that
PyQt4 >= 4.7 or PySide >= 1.0.3 is available,
and only one is imported per session.

Currently-imported Qt library:   'pyqtv1'
PyQt4 installed:                 True
PySide >= 1.0.3 installed:       False
Tried to load:                   ['pyside', 'pyqt']

我已将此错误追溯到IPython's qt模块,但基本上强制加载'pyqtv1'(将api_opts = [QT_API]替换为api_opts = ['pyqtv1']个中断{{1}在QString窗口内。

但是,如果我这样做是为了让那些导入首先发生(通过导入模块,这个代码在其他任何东西之前),那个错误消失了,它基本上用IPython完全打破QString

我已经验证过,如果我在包含IPython实例的模块中创建一个自包含ImportError: cannot import name QString,请确保在执行QApplication导入后导入PyQt.QtGui,问到预期。只有当我尝试将IPython代码与任何其他IPython代码混合时才会破坏。

有关如何修复错误的任何建议吗?

我使用的是Ubuntu Linux 12.04,而IPython则是3月10日版本的2.0.0版本。

1 个答案:

答案 0 :(得分:0)

PyQt为字符串提供了两种不同的API:您可以选择使用哪种API代码:

import sip
sip.setapi('QString', 2)
from PyQt4 import QtGui

导入PyQt4后,该API已设置且无法更改。在Python 2上,默认为版本1以实现向后兼容,但IPython需要API版本2.版本2是Python 3的默认值,PySide的API等同于版本2.

如果您在应用程序中使用了v1 API,则无法使用该应用程序中嵌入的IPython Qt控制台,除非将其移植到v2 API。但是,您可以在应用程序中embed an IPython kernel,并在单独的进程中从Qt控制台连接到它。