0

我有一个中型 PyQT5 桌面应用程序,它在 py2app 上运行良好。我想合并 Esky 以便应用程序可以自行更新,但应用程序在启动期间(在显示主窗口之前)终止,日志条目显示“HelloApp 错误”(其中“HelloApp”是我的应用程序的名称)。

我创建了一个小测试用例,重现了https://github.com/markmont/esky-package-question上的问题

测试用例应用程序具有以下结构:

HelloApp/
    HelloApp/
        HelloApp.py
        helloform
            __init__.py
    setup.py

setup.py 包含:

from esky import bdist_esky
from distutils.core import setup

PY2APP_OPTIONS = {
    'argv_emulation': True,
    'includes': [ 'sip', 'PyQt5', 'helloform' ],
    'qt_plugins': [ '*' ]
    }
ESKY_OPTIONS = {
    "freezer_module": "py2app",
    "freezer_options": PY2APP_OPTIONS,
    "includes": [ 'sip', 'PyQt5', 'helloform' ]
    }
HelloApp = bdist_esky.Executable( "HelloApp/HelloApp.py", gui_only=True )

setup(
    name='HelloApp',
    version = "2014060301",
    data_files=[],
    options = { "bdist_esky": ESKY_OPTIONS },
    scripts=[ HelloApp ]
)

HelloApp.py 包含该语句from helloform import Form——这似乎是导致应用程序无法以错误“HelloApp 错误”启动的原因,好像我删除了该语句并粘贴了应用程序启动的 helloform/ init .py 的内容并正常工作。

另外,如果我将所有内容移到一个目录中并调整 setup.py 中的路径,则不会出现问题 - Esky 找到 helloform.py(以前称为 helloform/ init .py),包含它,然后应用程序启动并正常工作:

HelloApp/
    HelloApp.py
    helloform.py  # formerly ./HelloApp/helloform/__init__.py
    setup.py

...但是将所有内容放在单个目录中并不是中型到大型应用程序的可扩展解决方案。

问题发生时的输出中没有错误消息python setup.py bdist_esky,我也没有在 Esky 文档或网络上的各种示例中找到答案。

/var/log/system.log 的完整错误是:

2014-06-03 13:03:07.100 HelloApp[14968]: HelloApp Error

我假设我没有includes在 setup.py 中正确使用 Esky 的选项,但我不知道如何解决这个问题——谁能帮忙?

其他可能相关的详细信息:MacOS X 10.9 Mavericks、Python 2.7.6(本地构建)、qt-5.3.0 开源、sip 4.16、PyQT 5.3.0 (GPL)、py2app 0.8.1修补以支持 PyQT5和最新版本来自 GitHub 的 Esky。

提前致谢!

4

1 回答 1

0

我已经解决了这个问题——这个问题是由于我对 Python distutils 和 setuptools 的了解有限。由于 py2app(使用 setuptools)“刚刚工作”,我认为问题在于 Etsy 的配置方式,而问题实际上在于我使用 distutils 的方式。

问题是 helloworld.py 没有被复制到冻结的应用程序中。

该解决方案涉及重组文件并更改 disutils 配置以将 HelloApp 显式添加为包。

新文件结构:

HelloApp/
    hello.py   # formerly HelloApp.py
    HelloApp/
        __init__.py
        helloform.py
    setup.py

新的 setup.cfg:

from esky import bdist_esky
from distutils.core import setup

PY2APP_OPTIONS = {
    'argv_emulation': True,
    'includes': [ 'sip', 'PyQt5' ],
    'qt_plugins': [ '*' ]
    }
ESKY_OPTIONS = {
    "freezer_module": "py2app",
    "freezer_options": PY2APP_OPTIONS,
    "includes": [ 'sip', 'PyQt5' ]
    }

HelloApp = bdist_esky.Executable( "hello.py", gui_only=True )

setup(
    name='hello',
    version = "2014060301",
    data_files=[],
    options = { "bdist_esky": ESKY_OPTIONS },
    scripts=[ HelloApp ],
    packages=[ 'HelloApp' ],
)
于 2014-06-04T02:25:01.410 回答