PyQt5 错误 "PyCapsule_GetPointer called with incorrect name"

PyQt5 error "PyCapsule_GetPointer called with incorrect name"

我刚刚在 OpenSUSE leap 上使用 python 3.6.3 在 pyenv virtualenv 中构建了 PyQt5,构建很顺利,但是当我导入时

>>> from PyQt5 import QtCore
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: PyCapsule_GetPointer called with incorrect name

我可以导入PyQt5,但是我无法使用它下面的模块

>>> import PyQt5
>>> PyQt5.QtCore
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'PyQt5' has no attribute 'QtCore'

我读到 here 原因可能是系统上的另一个 sip,例如 PyQt4 安装,我尝试从包管理器中卸载 PyQt4 但没有帮助。

我不知道该怎么做,有什么想法吗?

如果我安装 python3-qt5 包并使用系统 python 它可以工作

编辑:

我在 OpenSUSE Leap 15 的另一台机器上使用 PyQt4 时遇到了同样的问题,解决方案是配置 sip:

python configure.py --sip-module PyQt4.sip --no-dist-info --no-tools

PyQt4 doc

中所述

您的应用程序是否同时导入了 PyQt4 和 5?

我在 windows 上看到了第一个错误:

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Executable: D:\Python37\python.exe
>>> from PyQt5 import QtWidgets
>>> from PyQt4 import QtGui, QtCore
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: PyCapsule_GetPointer called with incorrect name

好的,这实际上很简单,如文档中所述 (PyQt4, PyQt5),SIP 必须使用 --sip-module 选项进行配置,因此对于 PyQt5,我做了:

python configure.py --sip-module PyQt5.sip --no-tools

对于 PyQt4:

python configure.py --sip-module PyQt4.sip --no-tools

这适用于 PyQt >= 4.12.2 和 PyQt >= 5.11

编辑: PyQt5 现在有所谓的 PyQt-builder,见 PyQt5 doc

我将 PyQt5 降级到 5.7.1,它对我有用。

所以对我来说,当我尝试使用 pyuic5.

时发生了这个错误

在我的例子中,我只需要激活我的 virtual_environment 然后它就起作用了。

为了后代,我在我的 PyQt5 应用程序中遇到此错误很长一段时间,因为我使用了两个自定义库(libArcus 和 libSavitar),它们也使用 SIP 来编译 Python 绑定。通过确保在 PyQt5 之前首先导入我的自定义库(使用较新的 SIP 版本)最终解决了这个问题:

https://github.com/Ultimaker/Cura/blob/b20a349b4454d08e34b3c3ea3f537a380e4c7696/cura_app.py#L140-L141

这成功了。然而,当 运行 应用程序通过 PyCharm 的调试器时,我仍然遇到同样的错误。今天我发现 PyCharm 可以选择 "enable PyQt5 compatibility" 与某个 PyQt5 版本。在 Settings -> Debugger -> PyQt compatible 下禁用这个选项修复了这个问题。