【发布时间】:2019-06-25 17:09:30
【问题描述】:
我正在使用 Ubuntu 18.04 和 PyQt 5.12.1 构建一个应用程序,它导入 Python 包 generated from MATLAB code(这些包依赖于 MATLAB 运行时)。 Python 中的 MATLAB 包需要设置 LD_LIBRARY_PATH 环境变量;如果没有这个,程序会在导入 MATLAB 生成的包时引发异常。
但是,我发现当设置LD_LIBRARY_PATH 时,PyQt 无法运行。只要未导入 MATLAB 包且未设置 LD_LIBRARY_PATH,程序在安装了 MATLAB Runtime 的情况下运行良好。
根据 MATLAB 运行时安装程序的提示,我将其添加到我的 PyCharm 运行/调试配置中的环境变量中:
LD_LIBRARY_PATH=/usr/local/MATLAB/MATLAB_Runtime/v96/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v96/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v96/sys/os/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v96/extern/bin/glnxa64.
这会导致程序的 PyQt 部分崩溃。使用QT_DEBUG_PLUGINS=1环境变量,报错信息如下:
Got keys from plugin meta data ("xcb")
QFactoryLoader::QFactoryLoader() checking directory path "<redacted>/PyMODA/venv/bin/platforms" ...
Cannot load library <redacted>/venv/lib/python3.6/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so: (/usr/local/MATLAB/MATLAB_Runtime/v96/bin/glnxa64/libQt5XcbQpa.so.5: undefined symbol: _ZNK14QPlatformTheme14fileIconPixmapERK9QFileInfoRK6QSizeF6QFlagsINS_10IconOptionEE)
QLibraryPrivate::loadPlugin failed on "<redacted>/venv/lib/python3.6/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so" : "Cannot load library <redacted>/venv/lib/python3.6/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so: (/usr/local/MATLAB/MATLAB_Runtime/v96/bin/glnxa64/libQt5XcbQpa.so.5: undefined symbol: _ZNK14QPlatformTheme14fileIconPixmapERK9QFileInfoRK6QSizeF6QFlagsINS_10IconOptionEE)"
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.
重要的部分:
"Cannot load library <...>/libqxcb.so: (/usr/local/MATLAB/MATLAB_Runtime/v96/bin/glnxa64/libQt5XcbQpa.so.5: undefined symbol: _ZNK14QPlatformTheme14fileIconPixmapERK9QFileInfoRK6QSizeF6QFlagsINS_10IconOptionEE)"
MATLAB 运行时在/usr/local/MATLAB/MATLAB_Runtime/v96/bin/glnxa64/ 中提供libQt5XcbQpa.so.5,必须将其导出到LD_LIBRARY_PATH。设置LD_LIBRARY_PATH时似乎PyQt正在使用它,并且它是与当前版本的PyQt不兼容的旧版本。
另一个同名库在/usr/lib/x86_64-linux-gnu/,它的MD5校验和与MATLAB版本不同。但是,将此目录添加到 LD_LIBRARY_PATH 的开头并没有帮助。设置QT_QPA_PLATFORM_PLUGIN_PATH 也无济于事。
有没有办法让/usr/lib/x86_64-linux-gnu/ 中的版本比 MATLAB 提供的库具有更高的优先级?有没有其他方法可以解决这个问题?
【问题讨论】:
标签: python linux matlab ubuntu pyqt5