【发布时间】:2015-06-23 11:38:12
【问题描述】:
我正在开发一个小的跨平台 python 项目。我想将文件扩展名与程序相关联,因此对于 OSX,脚本似乎必须成为应用程序。 py2app 似乎是完成这项工作的完美工具,但我很难找到关于它的好的文档。
我的 python 脚本依赖于我编写的包 (k.tk) 并符号链接到 /Library/Python/2.7/site-packages/k/tk(单个文件符号链接到文件夹中 - 文件夹不是符号链接)。
这是我正在使用的 setup.py 脚本:
"""
This is a setup.py script generated by py2applet
Usage:
python setup.py py2app
"""
from setuptools import setup
import sys
APP = ['randomizer.py']
DATA_FILES = []
OPTIONS = {'argv_emulation': True, 'includes': ['k.tk']}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app']
)
我的设置有两个问题,我发现了一个我不喜欢的非常丑陋的解决方法。
第一个问题 - 别名构建
使用python setup.py py2app -A 构建时会出现第一个问题。这应该使用指向源文件的链接来构建应用程序,以使开发更容易。但是,当我尝试运行生成的应用程序时,它说
导入错误:没有名为 k.tk 的模块
解决方法是将这些行附加到 python 脚本中:
import sys
sys.path.append("/Library/Python/2.7/site-packages/")
这似乎意味着从应用程序调用 python 环境时出现问题,但我对 py2app 了解不足,不知道如何修复它。
第二个问题 - 完整构建
使用python setup.py py2app 构建时会出现第二个问题。这会触发常规构建并将所有库复制到应用程序中。当我运行这个应用程序时,我得到了
OSError: [Errno 20] Not a directory: '[path snipped]/application.app/Contents/Resources/lib/python2.7/site-packages.zip/k'
这里丑陋的解决方法是打开应用程序的文件并将 site-packages.zip 解压缩到名为 site-packages.zip 的文件夹中。现在错误消息中给出的路径是一个目录,应用程序运行正常。
有谁知道如何解决这个问题?我感到很困惑,我能找到的唯一文档是this,这似乎非常有限。
更新
我尝试将/Library/Python/2.7/site-packages/k 目录复制到项目目录中。这修复了 Aliased Build,但不幸的是不是 Full Build。
我还尝试按照 Python 文档 (here) 中的说明正确打包和安装。这具有相同的效果。我感到很沮丧;为什么它会尝试像查看文件夹一样查看 zip 文件?
更新
我最终编写了一个构建脚本,它只是用同名的目录覆盖了 zip。这解决了问题,但我对解决方案不满意。
我也开始尝试使用 py2exe 为 Windows 构建。在 Windows 中,我遇到了完全相同的问题!此时间 library.zip 已创建并且必须解压缩才能运行程序。当然,这些程序不只是碰巧有完全相同的错误,但我无法想象为什么它们都错误地期望一个 zip 文件可以像文件夹一样被访问。
【问题讨论】:
-
你试过
includes': ['k', 'k.tk']吗? -
我在这一行中包含了
k.tk:OPTIONS = {'argv_emulation': True, 'includes': ['k.tk']}。我尝试将其更改为OPTIONS = {'argv_emulation': True, 'includes': ['k', 'k.tk']},但问题仍然存在。 -
系统 Python 中有
k吗?您需要安装另一个 Python 才能使 bundle 工作,例如HomeBrew。 -
我相信我正在使用系统 Python。 py2app不能使用系统Python?
-
我相信它不会使用任何系统库进行独立构建,但我不确定别名模式。
标签: python python-2.7 py2exe py2app