如何解决如何通过具有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上的便携式应用程序吗?理想情况下,食谱应说明如何使用自定义应用程序图标,但这不是必需的。
参考文献:
- Python 3.8.5
- macOS 10.15.7 Catalina
- 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 Catalina
- 使用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
测试
以下是测试运行的屏幕截图:
,我认为您缺少的是在您的应用程序包中包含Python3框架。我最近亲自开发了一个简单的macOS应用程序,但是我想对如何做有更多的了解,因此我对应用程序的实际结构做了一些深入研究。基本上,您将使用应用程序的名称将所有内容放入普通文件夹。将此文件夹命名为MyApp
。在此文件夹中,我们将有另一个名为Contents
的文件夹。据我了解,py2app
只是构成了应用程序的所有内容,并在此文件夹内进行结构化,并创建了一个Info.plist
文件,该文件也位于Contents
内。到目前为止,这是您拥有的:
MyApp
-> Contents
-> -> Info.plist
除了Info.plist
文件和所有必要的properties之外,在您的Contents
文件夹中,您还将拥有一个MacOS
文件夹和一个Resources
文件夹至少。您的问题是,您还需要一个Frameworks
文件夹,您将在其中添加所需版本的Python。
现在,您的应用层次结构应如下所示:
MyApp
-> Contents
-> -> Info.plist
-> -> MacOS
-> -> Resources
-> -> Frameworks
在Frameworks
文件夹中,您可以放入正在使用的完整Python 3框架来构建应用程序,以及运行该应用程序所需的所有站点包,然后可以反映可执行文件中的所有这些更改,以便您指向正确的安装。
据我了解,要使该应用程序在MacOS上正常运行,必须确保将主可执行文件放在MacOS
文件夹中,并指向位于Frameworks
文件夹中的Python,图标.icns
文件放置在Resources
文件夹中,并且您的Info.plist
文件已构建。
为了使MacOS能够将其识别为完整的应用程序,我相信您可能需要使用productbuild
并包含开发人员许可证证书,但实际上只有在要分发应用程序的情况下才有必要。否则,我只是将扩展名.app
添加到MyApp
,将其转换为应用程序。
如果没有上述许可/证书,它可能不会识别它应该找到您的图标文件并添加它,因此,如果在“预览”中将其打开,全选并复制,您应该能够右键单击该应用程序,按“获取信息”,然后将图标粘贴到窗口中当前图标的顶部,以使其正确显示。
编辑:我的资源,用于学习制作macOS应用程序:
,在对 build a macOS bundle for a PySide2 application 的不同选项摆弄了很多之后,我发现以下步骤几乎可以立即使用。
此使用 pyinstaller
创建 macOS 应用程序包的方法已在 macOS Catalina 10.15.7 上使用 Python 3.9.1、PySide2 5.15.2、pyinstaller 4.2 进行测试。
-
安装 pyenv 和具有框架支持的最新 Python(有关 pyenv 工作原理的一般介绍,请参阅 Pyenv、How to manage multiple Python versions and virtual environments):
brew install pyenv PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.9.1
-
为示例创建一个文件夹,创建一个示例pyside应用程序:
mkdir hello && cd hello nano hello.py
hello.py:
import sys from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.setWindowTitle("Hello World") self.button = QPushButton("Click me") self.button.clicked.connect(self.say_hello) self.setCentralWidget(self.button) @Slot() def say_hello(self,url): self.button.setText("Hello!") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())
-
为项目创建一个venv,安装python包:
pyenv local 3.9.1 python3 -m venv venv source venv/bin/activate pip install pip pyside2 pyinstaller --upgrade
-
尝试使用 python 解释器运行应用程序:
python3 hello.py
-
创建 macos 应用程序包:
pyinstaller --windowed hello.py
-
使用应用程序包运行应用程序:
open dist/hello.app
-
检查为构建配置生成的
hello.spec
,使用pyinstaller hello.spec
重新构建应用。
我认为可以here找到解决您问题的方法。首先,创建a virtual environment并将所有模块安装到同一虚拟环境中。
mkvirtualenv --python="PATH/TO/PYTHON3.6.5/python.exe" venv
安装Qt
框架
# Install qt via homebrew
brew install qt
# Switch to version 5.11.1
brew switch qt 5.11.1
# Do this to link qmake with qt
brew link qt5 --force
然后,安装PySide2
git clone --recursive https://code.qt.io/pyside/pyside-setup
之后,
cd pyside-setup && git checkout 5.11
构建并安装PySide2
,并确保设置QMAKE
安装随附的Qt
的路径
#To get the path
which qmake
# Make sure that your virtual environment is activated
# Build PySide2 from source
python setup.py install --qmake=<PATH/TO/QMAKE> --build-tests --ignore-git --jobs=8
# Install PySide2
python setup.py build --qmake=/path/to/qmake --build-tests --ignore-git --jobs=8
更新
首先,请确保在相同的虚拟环境中运行代码,并将其转换为标准的Mac OS应用程序,您可以使用py2app或pyinstaller。另外,如果按照相同的步骤操作,如果您的py2app无法与当前版本一起使用,请尝试将其降级。
sudo easy_install py2app
#or
pip install -U git+https://github.com/metachris/py2app.git@master
创建setup.py
py2applet --make-setup app.py
Wrote setup.py
,您必须创建a config file或see this example并包含您拥有的任何文件
from setuptools import setup
APP = ['app.py']
DATA_FILES = []
OPTIONS = {
'argv_emulation': True,'iconfile': 'app.icns'
}
setup(
app=APP,)
要构建应用程序,请使用
python setup.py py2app -A
要运行该应用程序,您必须使用这种方式
./dist/app.app/Contents/MacOS/app
如果可以与python setup.py py2app -A
一起使用,则表示一切正常,您需要使用
rm -rf build dist
python setup.py py2app
如果出现任何问题,请参考以下参考文献1,2和3。另外,有alternatives ways可以将您的应用转换为操作系统。
在阅读您的评论后,我试图查看问题出在哪里,我发现this可以解决问题,或者您可以使用bbFreeze
,pyInstaller
等替代工具或cx_Freeze
我已经使用fbs成功构建了应用。 它旨在构建Python + PyQt5应用程序(您也可以使用PySide2),并且也应在Mac OS上运行(根据文档/教程)。
使用PyInstaller时,由于包含PyQt5依赖关系而导致失败(特别是当我使用pyqtgraph
时),但是使用fbs则效果很好。
如果要打包用于OSX,则应该
创建酿造水龙头
这对于开源开发人员来说可能最有意义
一般说明https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap
- 在git中托管代码(不必是GitHub)
- 创建公式(Formula Cookbook) GitHub上的
- 叉子homebrew-core
- 添加您的公式并创建拉取请求,以将其放入主仓库
- 支持您的拉取请求,使其完成
加入Apple开发人员计划
这对于封闭源代码开发人员来说最有意义
概述:https://developer.apple.com/programs/how-it-works/
该计划每年的费用为99USD,但您可以在自己的包裹/最终二进制文件上签名并亲自或在其App Store上分发
创建帐户后,这是打包和签名OSX https://developer.apple.com/forums/thread/128166
的指南- 结构化代码以支持签名(添加构建步骤以将您的工作复制到干净的路径中,以免造成麻烦的返工)
-
% codesign -s <Developer ID Application signing identity> /path/to/code
- 选择一种存储格式(
.zip
,.dmg
,.pkg
)并捆绑您的应用程序
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。