使用 py2app 捆绑 PyQt5 应用程序:不断收到“中止陷阱:6”错误

Posted

技术标签:

【中文标题】使用 py2app 捆绑 PyQt5 应用程序:不断收到“中止陷阱:6”错误【英文标题】:Bundling a PyQt5 application using py2app: keep getting "Abort trap: 6" error 【发布时间】:2015-03-27 19:45:58 【问题描述】:

我正在尝试使用此代码创建一个 OS X 应用程序:

import sys
from PyQt5.QtWidgets import QApplication

if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.lastWindowClosed.connect(app.quit)
    sys.exit(app.exec_())

我在 OS X 10.10 中使用 Python 2.7.9 中的 py2app (0.9.1) 和 PyQt5 (5.4.0)。该应用程序似乎构建得很好。启动应用程序后,它立即崩溃并显示“Abort trap: 6”。

我尝试使用由 py2applet 创建的默认 setup.py 以及直接从 py2applet 生成应用程序。 python 文件本身运行时不会崩溃。

任何想法/帮助将不胜感激!

【问题讨论】:

【参考方案1】:

您导入QApplication,然后尝试使用包名称对其进行实例化:QtWidgets.QApplication 除此之外,我使用了以下 setup.py 并且它有效:

from setuptools import setup
setup(
app=["MyApplication.py"],
setup_requires=["py2app"],
)

运行命令python3 setup.py py2app -A --packages=PyQt5 生成了一个工作应用程序。当您收到错误时,请检查控制台是否有任何输出。这在调试时会有所帮助。

附带说明一下,当我打包 PyQt 应用程序时,我通常还会复制任何 Qt 插件并运行 macdeployqt 工具来修复链接。:

cp -R /Developer/Qt/5.3/clang_64/plugins/ dist/MyApplication.app/Contents/PlugIns
macdeployqt dist/MyApplication.app

【讨论】:

感谢 QApplication 修复。我在复制代码时搞砸了。正如您可能猜到的那样,这并不是导致失败的原因。 使用 -A 标志在我的本地机器上工作,但会导致应用程序在没有所有必需库的任何机器上失败。 macdeployqt 可以修复任何 Qt 插件的链接问题,但不是我需要为我的实际应用程序复制的所有库。你能想出一种不用 -A 来完成这项工作的方法吗? 尝试复制 Qt 插件并运行 macdeployqt。这对我有用。 另外,将import sipimport PyQt5 添加到您的python 代码中。 py2app 将使用它来添加依赖项。 我遇到了与此处描述的相同的问题。但是,当我尝试运行 macdeployqt 时,我收到关于找不到 python 2.7 文件的错误:错误:“/usr/local/opt/python/lib/Python.framework/Versions/2.7/Python 处没有文件我怀疑某些 qt原因看起来是 2.7。知道如何解决这个问题吗?【参考方案2】:

在为这个问题苦苦挣扎了一段时间但无法找到解决方案之后,我切换到了 PyInstaller,它对我来说是开箱即用的 PyQt 5.6.1。我在blog post 中详细介绍了我的一些发现以及为什么我最终选择 PyInstaller 而不是其他可用的冰柜。

【讨论】:

以上是关于使用 py2app 捆绑 PyQt5 应用程序:不断收到“中止陷阱:6”错误的主要内容,如果未能解决你的问题,请参考以下文章

Esky 不包括子模块

PyQt5配合Qt-Designer实现GUI

用 py2app 制作的 Python 应用程序不起作用

sh 使用py2App构建应用程序

无法在终端执行使用 tkinter 和 py2app 创建的 Mac 应用程序

如何让 py2app 和 cxfreeze 使用 Python 3 作为默认版本