pyinstaller + pyqt5:找不到或加载“可可”
Posted
技术标签:
【中文标题】pyinstaller + pyqt5:找不到或加载“可可”【英文标题】:pyinstaller + pyqt5: could not find or load "cocoa" 【发布时间】:2017-09-28 10:29:55 【问题描述】:我认为我在过去 24 小时内已尽我所能,但似乎没有任何效果。我有一个 python 脚本,我想从中创建一个 Mac OS X App Bundles。我使用以下选项运行 pyinstaller
:
pyinstaller --onefile --windowed --exclude-module matplotlib test.py
。一切似乎都很好(输出主要是带有几个 dyld: 警告的 INFO 消息)。但是,当我尝试执行应用程序时,它会立即关闭。尝试运行生成的 UNIX 可执行脚本 test
失败并出现以下错误:
objc[24785]: Class RunLoopModeTracker is implemented in both /var/folders/gd/b5gj1m4x09b6jpb1llxk4vlr0000gn/T/_MEIOWkdrF/QtCore and /usr/local/Cellar/qt/5.9.1/lib/QtCore.framework/Versions/5/QtCore. One of the two will be used. Which one is undefined.
objc[24785]: Class NotificationReceiver is implemented in both /var/folders/gd/b5gj1m4x09b6jpb1llxk4vlr0000gn/T/_MEIOWkdrF/QtWidgets and /usr/local/Cellar/qt/5.9.1/lib/QtWidgets.framework/Versions/5/QtWidgets. One of the two will be used. Which one is undefined.
objc[24785]: Class QCocoaPageLayoutDelegate is implemented in both /var/folders/gd/b5gj1m4x09b6jpb1llxk4vlr0000gn/T/_MEIOWkdrF/QtPrintSupport and /usr/local/Cellar/qt/5.9.1/lib/QtPrintSupport.framework/Versions/5/QtPrintSupport. One of the two will be used. Which one is undefined.
objc[24785]: Class QCocoaPrintPanelDelegate is implemented in both /var/folders/gd/b5gj1m4x09b6jpb1llxk4vlr0000gn/T/_MEIOWkdrF/QtPrintSupport and /usr/local/Cellar/qt/5.9.1/lib/QtPrintSupport.framework/Versions/5/QtPrintSupport. One of the two will be used. Which one is undefined.
QObject::moveToThread: Current thread (0x7f9dbdbb8400) is not the object's thread (0x7f9dbbd8bc20).
Cannot move to target thread (0x7f9dbdbb8400)
You might be loading two sets of Qt binaries into the same process. Check that all plugins are compiled against the right Qt binaries. Export DYLD_PRINT_LIBRARIES=1 and check that only one set of binaries are being loaded.
This application failed to start because it could not find or load the Qt platform plugin "cocoa"
in "".
Available platform plugins are: cocoa, minimal, offscreen.
Reinstalling the application may fix this problem.
Abort trap: 6
logout
Saving session...completed.
[Process completed]
更多信息:
Mac OS X: 10.11.6
Python: 2.7.13
qt: stable 5.9.1 (bottled) (via brew)
pyqt: stable 5.9 (bottled) (via brew)
pyinstaller: 3.3 (via pip)
脚本test.py
从xlsx
电子表格(openpyxl
) 中读取数据,并根据提供的模板(docxtpl
) 创建多个.docx
文件。它有简单的接口design.py
,从.ui
通过pyuic5
转换为.py
。
我做错了什么? (或者我没有做什么?)什么会导致这样的问题?
我尝试修复它:
一开始我并没有排除matplotlib
,但是导致了RuntimeError:
RuntimeError: Path in environment MATPLOTLIBDATA not a directory
[26131] Failed to execute script test
另外,我认为两组qt插件的错误可能是由于Qt4的存在。我对 Qt 安装一团糟。有 brew 的 qt5
(用 python2 构建)和另一个 macports 的 qt5-mac
加上 qt4-mac
。我卸载了qt4-mac
并停用了qt5-mac
,但没有帮助。
我重新安装了qt
、pyqt
和pyinstaller
,以确保它们都是用python 2.7
构建的。
在切换到pyinstaller
之前,我尝试了py2app
。起初,我使用py2applet --make-setup test.py
创建一个安装文件。同样,构建正常,但执行失败。从控制台运行 (dist/test.app/Contents/MacOS/MyApp
) 发现缺少一些库:ImportError: No module named docxtpl
。添加 pyqt 包 python setup.py py2app -A --packages=PyQt5
也没有帮助。手动将OPTIONS = 'argv_emulation': True, 'includes':['sip','PyQt5','PyQt5.QtWidgets']
添加到setup.py
也没有区别。
另一组 qt 插件位于/var/folders/
,这是每个用户临时文件和缓存的位置。不知道 OS X 究竟是如何管理这个的,但知道清理它是安全的。但是,我确实这样做了,在构建或/和运行之前清理 /var/folders/gd
什么也没做。 Cashed 文件夹再次出现并干扰 qt 的插件。不确定,这是问题的根源,但没有更多的想法如何解决它。
【问题讨论】:
【参考方案1】:pyinstaller 3.3 和 conda python3.6.3 和 PyQt 5.6.0 或多或少有同样的问题。 /var/folders/...
中的 .dylib 文件与 conda 安装文件夹中的文件冲突。即使我删除了它们,它们仍然会再次出现。
我终于通过将--runtime-tmpdir
的临时目录指定给pyinstaller 来完成这项工作。
例如pyinstaller --onefile --windowed --runtime-tmpdir /your/temp/directory --exclude-module matplotlib test.py
【讨论】:
以上是关于pyinstaller + pyqt5:找不到或加载“可可”的主要内容,如果未能解决你的问题,请参考以下文章
如何解决意外的 pyinstaller 异常“找不到 pyqt5_plugins 分发”?
Pyinstaller:找不到 PyQT5 Web 应用程序的 QtWebEngineProcess.exe
Python pyinstaller没有自动将依赖库打包进去,运行时提示找不到模块ModuleNotFoundError: No module named ‘PyQt5‘
Python pyinstaller没有自动将依赖库打包进去,运行时提示找不到模块ModuleNotFoundError: No module named ‘PyQt5‘