首页 > 解决方案 > 如何从具有 PySide2 GUI 的 python 脚本构建一个 mac os 应用程序?

问题描述

语境:

我正在使用 PySide2 GUI 开发一个简单的 Python 应用程序。它目前在 Windows、Linux 和 Mac 上运行良好。在 Windows 上,我可以使用 PyInstaller 和 InnoSetup 来构建一个简单的安装程序。然后我尝试在 Mac 上做同样的事情。它很快就坏了,因为系统拒绝启动命令或 PyInstaller 生成的应用程序,因为它没有正确签名。因为我不是苹果开发者,所以我不能签署任何东西......

经过一番研究,我尝试了 py2app。我可以在这里更进一步。和

python setup.py py2app -A

我可以创建一个可运行的应用程序。这显然不能移植到不同的系统,因为它使用我的开发文件夹。如果我使用python setup.py py2app生成的程序无法启动,因为 py2app 没有复制所有必需的 Qt 内容。我尝试将缺少的库一一添加,但最终系统找不到插件,我放弃了...

问题:

有人可以帮助我使用 Qt GUI 将 python 脚本或包转换为 Mac 上的便携式应用程序吗?理想情况下,配方应该说明如何使用自定义应用程序图标,但这不是必需的。

参考:

由于我的真实包对于 SO 问题来说太大了,所以我将其缩减为一个最小的可重现示例:

from PySide3.QtWidgets import *
import sys


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        hello = QLabel('Hello', self)
        hello.move(50, 50)

def run(args):
    app = QApplication(args)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    run(sys.argv)

这是用于 py2app 的 setup.py 文件:

from setuptools import setup

APP = ['app.py']
DATA_FILES = []
OPTIONS = {}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

标签: pythonmacospyinstallerpyside2py2app

解决方案


要求

  • 适用于 Python 3.8.5
  • macOS 10.15.7 卡塔利娜
  • 使用 PySide2 和 py2app

问题

  • PySide2必须在 OPTIONS 下添加到包列表中
  • 运行应用程序时仍然会出现错误:Library not loaded: @rpath/libshiboken2.abi3.5.15.dylib, Reason: image not found

解决方案

稍作修改的 setup.py 可能如下所示:

from setuptools import setup

APP = ['app.py']
DATA_FILES = []
OPTIONS = {
    'packages': ['PySide2'],
    'iconfile': 'some_icon.icns',
    'plist': {
        'CFBundleDevelopmentRegion': 'English',
        'CFBundleIdentifier': "com.ballesta.xxx",
        'CFBundleVersion': "1.0.0",
        'NSHumanReadableCopyright': u"Copyright © 2020, Serge Ballesta, All Rights Reserved"
    }
}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

此外,还添加了一些基本信息的图标定义和一些 plist 条目。

最好使用如下所示的脚本触发整个构建:

#!/bin/sh
python3 -m venv venv
. venv/bin/activate
pip install PySide2
pip install py2app
python setup.py py2app      
cp ./venv/lib/python3.8/site-packages/shiboken2/libshiboken2.abi3.5.15.dylib ./dist/app.app/Contents/Resources/lib/python3.8/lib-dynload/shiboken2

测试

这是测试运行的屏幕截图:

截屏


推荐阅读