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

Posted

技术标签:

【中文标题】将 IPython 嵌入 PyQt 应用程序的导入错误【英文标题】:Import Error embedding IPython into PyQt application 【发布时间】:2014-03-10 21:17:47 【问题描述】:

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

我已经粗略地改编了IPython's Github page 中的示例以适应我的应用程序的模块系统。但是,如果 any 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'] 会在 IPython 窗口内中断 QString

但是,如果我这样做是为了让这些导入首先发生(通过导入此代码所在的模块,然后再导入其他任何内容),该错误就会消失,并且它基本上会用ImportError: cannot import name QString 完全破坏QString

我已经验证,如果我在包含 IPython 实例的模块中创建一个自包含的 QApplication,确保在执行 IPython 导入后导入 PyQt.QtGui,它会按预期工作。只有当我尝试将 IPython 代码与任何其他 PyQt 代码混合时才会出现问题。

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

我使用的是 Ubuntu Linux 12.04,而 IPython 是 3 月 10 日发布的 2.0.0-dev 版本。

【问题讨论】:

您是否尝试过使用已发布的 IPython 版本之一,例如 1.2 系列? 2.0系列发生了很多变化,这可能是他们最后的一个错误。 是的,1.2 系列没有内置的“本地”功能。这就是我在开发版本上的原因。否则我会使用代码here,这实际上是 2.0 系列中的东西最初是如何产生的:p 【参考方案1】:

PyQt 为字符串提供了两种不同的 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 控制台连接到它。

【讨论】:

是的,我最终通过在 .bashrc 中将 QT_API 标志设置为 pyqt 并将所有对 from PyQt4.QtCore import QString 的调用包装起来来强制 v2 解决了这个问题try ... except ImportError: QString = str。这似乎使在 Python 2.7x 上运行的一切都变得愉快,尽管我实际上切换回 1.12 版本并使用与我的 OP 中链接的其他 SO 问题中的该代码的原始版本。虽然必须确保禁用 pylab,否则它会尝试 gank 我通过我的应用程序使用的所有 matplotlib 图形。

以上是关于将 IPython 嵌入 PyQt 应用程序的导入错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将 IPython 解释器嵌入到在 IPython Qt 控制台中运行的应用程序中

PyQt 事件循环和 ipython 中的异常

导入 PyQt5 时出现 RuntimeError

Matplotlib 将图形嵌入到 UI PyQt5

Ipython notebook 小技巧

为啥 PyQt4 在 Jupyter 和 IPython 笔记本之间的行为不同?