我有一个中等大小的PyQT5桌面应用程序,它一直很适合使用py2app。我想要合并Esky,以便应用程序可以自我更新,但是应用程序在启动期间(在显示主窗口之前)终止,其中有一个日志条目,上面写着"HelloApp Error“(其中"HelloApp”是我应用程序的名称)。
我创建了一个小的测试用例,它再现了在https://github.com/markmont/esky-package-question上可用的问题
测试用例应用程序具有以下结构:
HelloApp/
HelloApp/
HelloApp.py
helloform
__init__.py
setup.pysetup.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 ]
)helloform/init.py包含语句from helloform import Form --这似乎是导致应用程序无法从"HelloApp错误“开始的原因,就好像我删除了该语句并粘贴到应用程序启动并正常工作的内容中一样。
另外,如果我将所有内容移到一个目录中并调整setup.py中的路径,那么问题就不会发生-- Esky找到了helloform.py (以前命名为helloform.py),应用程序启动并正常工作:
HelloApp/
HelloApp.py
helloform.py # formerly ./HelloApp/helloform/__init__.py
setup.py对于中型到大型应用程序来说,...but将所有内容都放在单个目录中并不是一个可伸缩的解决方案。
当问题发生时,python setup.py bdist_esky的输出中没有错误消息,我也没有在Esky文档或web上的各种示例中找到答案。
来自/var/log/system.log的完整错误是:
2014-06-03 13:03:07.100 HelloApp[14968]: HelloApp Error我假设我在setup.py中没有正确地使用Esky的setup.py选项,但是我不知道如何解决这个问题--有人能帮上忙吗?
其他可能相关的细节: MacOS X 10.9小牛,Python2.7.6(本地构建),qt-5.3.0开源,sip 4.16,PyQT 5.3.0 (GPL),py2app 0.8.1 修补以支持PyQT5,以及GitHub的最新版本。
提前感谢!
发布于 2014-06-04 02:25:01
我已经解决了这个问题--这个问题是由于我对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' ],
)https://stackoverflow.com/questions/24021485
复制相似问题