微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过具有PySide2 GUI的Python脚本构建Mac OS应用? 上下文:问题:参考文献:

如何解决如何通过具有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

测试

以下是测试运行的屏幕截图:

screenshot

,

我认为您缺少的是在您的应用程序包中包含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应用程序:

Bundle structure

Including frameworks

Signing your application

productbuild manpage

,

在对 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 工作原理的一般介绍,请参阅 PyenvHow 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应用程序,您可以使用py2apppyinstaller。另外,如果按照相同的步骤操作,如果您的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 filesee 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

如果出现任何问题,请参考以下参考文献123。另外,有alternatives ways可以将您的应用转换为操作系统。

在阅读您的评论后,我试图查看问题出在哪里,我发现this可以解决问题,或者您可以使用bbFreezepyInstaller等替代工具或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 举报,一经查实,本站将立刻删除。