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

2024-05-15 18:00:58 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文:

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

经过一些研究,我尝试了py2app。我可以更进一步。与

python setup.py py2app -A

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

问题:

有人能帮我把使用QtGUI的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'],
)

Tags: frompyimportapp应用程序mainwindowsmac
3条回答

我认为您缺少的是在应用程序包中包含Python3框架。我最近自己开发了一个简单的macOS应用程序,但是我想对如何实现这一点有更多的了解,所以我对应用程序的实际结构做了一些深入的研究。基本上,您将把所有内容都放在一个普通文件夹中,其中包含应用程序的名称。调用此文件夹MyApp。在这个文件夹中,我们将有另一个名为Contents。据我所知,py2app只需要将构成应用程序的所有内容都放在这个文件夹中,并将它们组织起来,同时创建一个Info.plist文件,该文件也放在Contents中。到目前为止,以下是您所拥有的:

MyApp

-> Contents

-> -> Info.plist

除了包含所有必需的propertiesInfo.plist文件之外,在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

^{} manpage

在对build a macOS bundle for a PySide2 application的不同选项进行了大量修改之后,我发现以下步骤基本上是现成的

在macOS Catalina 10.15.7上,使用Python 3.9.1、PySide2 5.15.2和pyinstaller 4.2对使用pyinstaller创建macOS应用程序包的方法进行了测试

  • 安装pyenv和具有框架支持的最新Python(请参见PyenvHow to manage multiple Python versions and virtual environments了解pyenv的工作原理):

    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重新构建应用程序

要求

  • 适用于Python 3.8.5
  • macOS 10.15.7 Catalina
  • 使用PySide2和py2app

问题

  • PySide2必须添加到包列表的选项下
  • 运行应用程序时,仍然会发生错误: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

相关问题 更多 >