Esky 不包括子模块
Posted
技术标签:
【中文标题】Esky 不包括子模块【英文标题】:Esky not including sub-module 【发布时间】:2014-06-03 17:33:39 【问题描述】:我有一个中型 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
我假设我没有在 setup.py 中正确使用 Esky 的 includes
选项,但我不知道如何解决这个问题——谁能帮忙?
其他可能相关的详细信息: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 patched to support PyQT5 和来自 GitHub 的最新版本的 Esky。
提前致谢!
【问题讨论】:
【参考方案1】:我已经解决了这个问题——这个问题是由于我对 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' ],
)
【讨论】:
以上是关于Esky 不包括子模块的主要内容,如果未能解决你的问题,请参考以下文章