python - 如何从具有 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 上的便携式应用程序吗?理想情况下,配方应该说明如何使用自定义应用程序图标,但这不是必需的。
参考:
- 蟒蛇 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)
这是用于 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'],
)
解决方案
要求
- 适用于 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
测试
这是测试运行的屏幕截图:
推荐阅读
- scala - 显示单词长度大于8的单词
- html - 如何在输入表单中隐藏提示?
- python - Python google云功能部署失败-Madmom pip包
- vb.net - 如何在 VB 中执行以下操作:月份的最后日期
- c# - ASP.NETCore 模型中的十进制字段格式
- python - Python检查内联字符串中的值并更改它
- swift - iOS 13 - 右栏按钮项目在模态表演示中偏移
- maven - 错误“无法传输文件 *.jar,状态码为 409”,尽管已传输
- reactjs - 在反应组件之间共享数据
- javascript - 如何在 Javascript 中从浏览器访问网络摄像头设备