如何从具有 PySide2 GUI 的 python 脚本构建 mac os 应用程序?

Ser*_*sta 17 python macos pyinstaller py2app pyside2

语境:

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

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

python setup.py py2app -A
Run Code Online (Sandbox Code Playgroud)

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

题:

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

参考:

  • 蟒蛇 3.8.5
  • macOS 10.15.7 卡特琳娜
  • PySide2 5.15.1
  • PyInstaller 4.0
  • py2app 0.22

由于我的真实包对于 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)
Run Code Online (Sandbox Code Playgroud)

这是用于 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'],
)
Run Code Online (Sandbox Code Playgroud)

Ste*_*cht 7

要求

  • 适用于 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'],
)
Run Code Online (Sandbox Code Playgroud)

此外,还添加了图标定义和一些基本信息的 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
Run Code Online (Sandbox Code Playgroud)

测试

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

截屏

  • 详细的答案以及完整的工作示例,甚至是演示。谢谢你! (2认同)