Esky不包括子模块

时间:2014-06-03 17:33:40

标签: python py2app esky

我有一个中等大小的PyQT5桌面应用程序,它与py2app一直运行良好。我希望合并Esky,以便应用程序可以自行更新,但应用程序在启动期间(显示主窗口之前)终止,并显示“HelloApp Error”(其中“HelloApp”是我的应用程序的名称)的日志条目。 / p>

我创建了一个小型测试用例,可以重现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 Error”启动的原因,就好像我删除了该语句并粘贴了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

我假设我没有在setup.py中正确使用Esky的includes选项,但我不知道如何解决这个问题 - 任何人都可以帮忙吗?

其他可能相关的细节:MacOS X 10.9 Mavericks,Python 2.7.6(本地版本),qt-5.3.0 opensource,sip 4.16,PyQT 5.3.0(GPL),py2app 0.8.1 patched to support PyQT5,以及来自GitHub的最新版Esky。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题 - 问题是由于我对Python distutils和setuptools的了解有限。事情"刚刚工作"使用py2app(使用setuptools),我认为问题在于当问题确实与我如何使用distutils时如何配置Etsy。

问题是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' ],
)