使用 Esky 冻结/打包 Cocoa PyObjC Python 应用程序

Posted

技术标签:

【中文标题】使用 Esky 冻结/打包 Cocoa PyObjC Python 应用程序【英文标题】:Using Esky to Freeze/Package a Cocoa PyObjC Python Application 【发布时间】:2015-06-29 22:01:57 【问题描述】:

所以我正在尝试为我的独立 OSX Python 应用程序组合一个自动更新功能,该应用程序基于 PyObjC 构建。只需通过 py2app 打包它就可以很好地工作,但我正在尝试用 Esky 冻结它,作为实现更新功能的一部分。

据我所知,这是我为 Esky 设置的 setup.py 格式。我不确定如何告诉 Esky 将我的 .Xib 文件的名称传递给 py2app。这是我的直接 py2app setup.py 的样子,成功包含 GUI 所需的 .Xib 文件:

py2app 的 setup.py

from setuptools import setup

APP = ['MyApp.py']
DATA_FILES = ['MyApp.xib']
OPTIONS = 'argv_emulation': False, 'packages' : ['PIL']

setup(
    app=APP,
    data_files=DATA_FILES,
    options='py2app': OPTIONS,
    setup_requires=['py2app'],
    iconfile="MyApp.icns"
)

环顾其他人的帖子,您似乎可以通过结构略有不同的 Esky setup.py 将设置传递给 py2app,但我终其一生都无法弄清楚确切的将 .Xib 文件从 Esky 传递给 py2app 的参数结构。

Esky 的 setup.py

from esky import bdist_esky
from distutils.core import setup

setup(name="MyApp",
      version="1.3.3",
      iconfile="MyApp.icns",
      data_files=['MyApp.xib'],
      scripts=["MyApp.py","midheaven.py"],
      options="bdist_esky":
      "includes":["PIL"],
      "excludes":['pydoc'],
      "freezer_module": "py2app",
      "freezer_options": 
                "plist": 
                    'argv_emulation': False,
                    'packages': ['PIL'],
                ,
                "data_files": ['MyApp.xib'],
            ,
      ,
      ,

     )

一切都没有错误地打包,但当然,如果我尝试运行应用程序的 Esky 冻结,它会立即崩溃。我很肯定这是因为它没有正确附加 .Xib GUI。任何人都有这方面的经验,或者关于如何实际格式化的想法?绝对很想弄清楚这一点并将其保存在此处以供后代使用。

【问题讨论】:

【参考方案1】:

你是对的,esky 做了一些与你预期不同的事情。查看演示/教程文件夹让我走上了正确的道路。

setup(name="MyApp",
      data_files=[('', ['MyApp.xib']),
                 ('files', ['file1', 'file2']),
                 ('img', glob(r'.\img\*.*'))
                  ]
      ...

所以你有一大堆元组,其中第一个条目是你的包中包含文件的路径,第二个是放在那里的文件的可迭代

您可以删除选项字典中的第二个 data_files 实例。

更新

试试

from esky.bdist_esky import Executable

executables = [Executable('example_gui.py', icon='myico.ico', gui_only=True,)]  

setup(
    scripts = executables
    ...

  

【讨论】:

所以[('this/is/the/include/path', ['MyApp.xib']), 你的意思是?我实际上仍然没有运气。如果文件与您的应用程序位于同一目录中,我假设路径将为空白。 第一个是安装后要放置文件的位置,第一个是文件相对于安装文件的源位置 @tomf 你能更新你试图运行的代码吗? 所以我更新了 setup.py 使其看起来更像这样:setup(name="MyApp", version="1.3.3", iconfile="MyApp.icns", data_files=[('', ['MyApp.xib'])], scripts=["MyApp.py","main.py"], options="bdist_esky": "excludes":['pydoc'], 'py2app':'argv_emulation': False, 'packages' : ['PIL'] , ) 具有相同的结果。 您的 .Xib 文件是否包含在它应该在的位置?尝试更新脚本并从您的设置中删除 incofile 关键字

以上是关于使用 Esky 冻结/打包 Cocoa PyObjC Python 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Esky,没有找到冻结的版本

Esky 的 Python 项目结构

通过 Esky 任务获取进度

在 macOS/Cocoa 应用程序中启动 GCDWebServer 会冻结应用程序

使用 Xcode 故事板会导致 Xcode 冻结,并且 Interface Builder Cocoa Touch Tool 飙升至 %99

有没有办法使用 esky 发送帖子数据?