【发布时间】:2016-06-14 17:31:18
【问题描述】:
我正在用 Python 开发一个 GUI 应用程序。我使用cx_Freeze 将我的应用程序变成.app/ / .dmg OS X 用户的文件。因此,例如,我可以使用 python setup.py bdist_dmg 让 cx_Freeze 创建一个 .dmg 文件,我的用户可以使用它来安装我的应用程序。
我现在希望我的应用能够自动更新。 Esky 似乎是一个很有前途的框架。我可以通过python setup.py bdist_esky 创建一个可以自我更新的应用程序版本。它产生以下目录结构:
myapp-
myapp-0.1/myapp- ...
- ...
顶级myapp 是Esky 的引导可执行文件。它在当前目录中查找,找到myapp-0.1/ 作为最新版本,然后启动myapp-0.1/myapp。
我如何将它打包成一个.dmg 文件,我可以发送给我的用户?在我修改setup.py 以使bdist_esky 工作后,bdist_dmg 不再工作。我得到的印象是,Esky 根本不适合与bdist_dmg 一起使用。它的文档根本没有提到 DMG 文件,而且我在 Google 上也找不到任何东西。
作为第一步,我尝试手动将 Esky 生成的文件转换为 OS X .app/ 包:
-
myapp.app/-
Contents/Info.plist-
MacOS/myapp-
myapp-0.1/myapp- ...
- ...
-
Info.plist 包含使 OS X 运行myapp 所需的最少信息量。但是,当我尝试运行 myapp.app 时,我得到:
Traceback (most recent call last):
File "<string>", line 318, in bootstrap
File "<string>", line 442, in get_best_version
FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/Temp/myapp.app/appdata'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 689, in <module>
File "<string>", line 335, in bootstrap
RuntimeError: no usable frozen versions were found
查看 Esky 的源代码,它似乎在其appdir_from_executable(...) 函数中对 OS X 捆绑包进行了一些特殊处理。为了让 Esky 高兴,我尝试重新排列我的文件,以便 appdata/ 确实存在:
-
myapp.app/-
appdata/-
myapp-0.1/myapp- ...
-
-
Contents/Info.plist-
MacOS/myapp- ...
-
很遗憾,这会导致另一个错误:
Traceback (most recent call last):
File "<string>", line 689, in <module>
File "<string>", line 336, in bootstrap
File "<string>", line 363, in chainload
File "<string>", line 425, in _chainload
UnboundLocalError: local variable 'exc_value' referenced before assignment
真的有那么难吗?我是唯一一个想要使用 Esky 以(标准).dmg 格式向用户发送文件的人吗?我错过了什么?
【问题讨论】:
标签: macos python-3.x cx-freeze esky