简单的 PyQt5 QML 应用程序导致分段错误
Posted
技术标签:
【中文标题】简单的 PyQt5 QML 应用程序导致分段错误【英文标题】:Simple PyQt5 QML application causes segmentation fault 【发布时间】:2016-09-08 00:51:33 【问题描述】:在尝试运行 very basic PyQt5 QML example 时,我发现我遇到了分段错误。我证实它似乎只处理显示 QML,因为 an example without a window 运行良好。我尝试了以下最小测试:
#!/usr/bin/python3
import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
# Main Function
if __name__ == '__main__':
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine("simple.qml")
engine.quit.connect(app.quit)
sys.exit(app.exec_())
simple.qml:
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow
width: 300
height: 200
title: "Simple"
visible: true
当我运行这个应用程序时,会在关闭之前出现一个窗口,就像在更详细的示例中一样,我在控制台中收到Segmentation fault
(仅此而已)。
从 GDB 运行显示 QSGRenderThread
正在接收 SIGSEGV:
(gdb) run snowman_qt.py
Starting program: /usr/bin/python3 snowman_qt.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7fffe912b700 (LWP 17200)]
[New Thread 0x7fffe3dbb700 (LWP 17201)]
[New Thread 0x7fffe1442700 (LWP 17202)]
[New Thread 0x7fffdbfff700 (LWP 17203)]
Thread 5 "QSGRenderThread" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffdbfff700 (LWP 17203)]
__strstr_sse2 (haystack_start=0x0, needle_start=0x7fffe28c9dd0 "nouveau") at ../string/strstr.c:63
63 ../string/strstr.c: No such file or directory.
回溯如下:
#0 __strstr_sse2 (haystack_start=0x0, needle_start=0x7fffe28c9dd0 "nouveau") at ../string/strstr.c:63
#1 0x00007fffe27233ea in QSGRenderContext::initialize(QOpenGLContext*) ()
from /usr/local/lib/python3.5/dist-packages/PyQt5/Qt/qml/QtQuick.2/../../lib/libQt5Quick.so.5
#2 0x00007fffe273e979 in ?? ()
from /usr/local/lib/python3.5/dist-packages/PyQt5/Qt/qml/QtQuick.2/../../lib/libQt5Quick.so.5
#3 0x00007ffff56835f9 in ?? () from /usr/local/lib/python3.5/dist-packages/PyQt5/Qt/lib/libQt5Core.so.5
#4 0x00007ffff7bc16fa in start_thread (arg=0x7fffdbfff700) at pthread_create.c:333
#5 0x00007ffff78f7b5d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
如果我运行 QML 文件 from a C++ application,则没有分段错误并且应用程序可以正常工作。请注意,我使用的是不带 PyOtherside 的 PyQT,但症状似乎相似。
有没有办法获取更多信息以继续调试?
我在 Linux Mint 18 上运行 Python 3.5.2。我的 QT 版本是 5.7.0,我的 PyQt 版本是 5.7,我的 SIP 版本是 4.18.1。
【问题讨论】:
【参考方案1】:兔子洞比我想象的要深。有一些问题。
-
Linux Mint 18(可能是 Ubuntu 16.04)存储库中的 SIP 版本太旧。我被installing from source更新到4.18.1。
使用更新的 SIP 版本,我可以compile the latest PyQt5 from source。然而,在编译之前,我必须安装 libqt5opengl5-dev 以便它可以与 QtOpenGL 模块一起编译。编译后,我使用
checkinstall
安装,这样回滚更容易。
使用最新的 SIP 和 PyQt5,我不再收到分段错误。但是,我遇到了 OpenGL 着色器没有正确创建的问题,只是收到了一个纯白色的窗口。
this bug 的解决方法是在 Python 程序中加载 PyQt 之前包含以下内容:
import ctypes
from ctypes import util
ctypes.CDLL(util.find_library('GL'), ctypes.RTLD_GLOBAL)
我相信这是带有 NVIDIA 显卡和二进制驱动程序的基于 Ubuntu 的操作系统所独有的。
【讨论】:
以上是关于简单的 PyQt5 QML 应用程序导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 PyInstaller 在 --onefile 中使用 QML 构建 PyQt5