Creating an OSX PyQt app using Pyinstaller 2, PyQt4 and Qt5
我正在尝试使用PyInstaller 2打包OSX的PyQt程序,其中已针对Qt 5.0.2(来自Git)构建了PyQt4(4.10)。以下简单示例不起作用。
1 2 3 4 5 6 7 8 9 10 11 | import sys from PyQt4.QtGui import QApplication, QMessageBox def main(): print"Hello" a = QApplication(sys.argv) m = QMessageBox(QMessageBox.Information,"Title","Hello") m.exec_() if __name__=="__main__": main() |
使用pyinstaller-2.0 / utils / MakeSpec.py生成并修改以添加BUNDLE类的规范文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | a = Analysis(['hello.py'], pathex=['/Users/glenn/rp/src/demo'], hiddenimports=[], hookspath=None) pyz = PYZ(a.pure) exe = EXE(pyz, a.scripts, exclude_binaries=1, name=os.path.join('build/pyi.darwin/hello', 'hello'), debug=False, strip=None, upx=True, console=False ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=None, upx=True, name=os.path.join('dist', 'hello')) app = BUNDLE(coll, name=os.path.join('dist', 'hello.app'), appname="Hello", version = '0.1' ) |
打包命令
1 | > python pyinstaller.py --windowed hello.spec |
直接从终端运行二进制文件会在崩溃之前提供此输出:
1 2 3 4 5 | $ ./dist/hello.app/Contents/MacOS/hello Hello Failed to load platform plugin"cocoa". Available platforms are: Abort trap: 6 |
这是堆栈跟踪:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x0000000000000000, 0x0000000000000000 Application Specific Information: abort() called Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 libsystem_kernel.dylib 0x9a671a6a __pthread_kill + 10 1 libsystem_c.dylib 0x93163b2f pthread_kill + 101 2 libsystem_c.dylib 0x9319a4ec abort + 168 3 QtCore 0x03db156b qt_message_fatal(QtMsgType, QMessageLogContext const&, QString const&) + 11 4 QtCore 0x03db19df QMessageLogger::fatal(char const*, ...) const + 63 5 QtGui 0x068abceb QGuiApplicationPrivate::createPlatformIntegration() + 3547 6 QtGui 0x068abd16 QGuiApplicationPrivate::createEventDispatcher() + 38 7 QtCore 0x03f4f2c4 QCoreApplication::init() + 100 8 QtCore 0x03f4f23b QCoreApplication::QCoreApplication(QCoreApplicationPrivate&) + 59 9 QtGui 0x068aa0d0 QGuiApplication::QGuiApplication(QGuiApplicationPrivate&) + 32 10 QtWidgets 0x06c695de QApplication::QApplication(int&, char**, int) + 238 11 PyQt4.QtGui.so 0x06394454 init_QApplication + 196 12 sip.so 0x007bc7d5 sipSimpleWrapper_init + 266 13 Python 0x0385c174 type_call + 340 14 Python 0x0380d401 PyObject_Call + 97 15 Python 0x0389c093 PyEval_EvalFrameEx + 10131 16 Python 0x038a0490 fast_function + 192 17 Python 0x0389beae PyEval_EvalFrameEx + 9646 18 Python 0x038998b2 PyEval_EvalCodeEx + 1922 19 Python 0x03899127 PyEval_EvalCode + 87 20 Python 0x038be06e PyRun_StringFlags + 126 21 Python 0x038bdfb1 PyRun_SimpleStringFlags + 81 22 Python 0x038bf619 PyRun_SimpleString + 25 23 hello 0x00003240 runScripts + 240 24 hello 0x0000280a main + 442 25 hello 0x00001eb9 _start + 224 26 hello 0x00001dd8 start + 40 |
问题似乎是找不到libqcocoa.dylib插件。这并不奇怪,因为它没有包装。这是这里的实际问题吗,我需要包括这个插件吗?如果是这样,它需要去哪里?我尝试将其放在demo.app/Contents/plugins中,但这无济于事。
放置libqcocoa.dylib的正确位置在
1 2 3 4 5 6 7 8 9 | extralibs = [("qt4_plugins/platforms/libqcocoa.dylib","/path/to/libqcocoa.dylib","BINARY") ] coll = COLLECT(exe, a.binaries + extralibs, a.zipfiles, a.datas, strip=None, upx=False, name=os.path.join('dist', 'hello')) |
应用程序现在启动,但对话框窗口永不出现。编辑:这是因为PyInstaller(v 2.0)将LSBackgroundOnly = true添加到应用程序Info.plist。删除此选项将显示窗口。
尝试添加(但已更改为PyQt):
1 | from PySide import QtCore, QtGui |
至少这对我有用(PySide 1.1.1,Qt 4.8.1,最新的dev Pyinstaller,OSX 10.7.5,无需更改spec文件和pyinstaller的--onefile --windowed参数。)此代码段也对我崩溃了。
我想这会带来更多的依赖性。
在另一个答案中找到了它。