py2app与用户包

时间:2015-06-23 11:38:13

标签: python python-2.7 py2exe py2app

我正在开发一个小型的跨平台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]不是目录:'[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目录复制到项目目录中。这修复了别名构建,但遗憾的是不是完整构建。

我还尝试按照Python文档(here)中的说明正确打包和安装。这具有相同的效果。我感到非常沮丧;为什么它会尝试将zip文件看作是一个文件夹?

更新

我最终编写了一个构建脚本,只需用同名目录覆盖zip。这解决了问题,但我对解决方案不满意。

我还尝试使用py2exe构建Windows。在Windows中,我遇到了完全相同的问题!这次创建了library.zip,必须将其解压缩才能运行该程序。当然,这些程序不仅恰好具有相同的错误,但我无法想象为什么他们都错误地期望zip文件可以像文件夹一样被访问。

2 个答案:

答案 0 :(得分:1)

py2app需要一个单独的Python安装而不是系统Python才能使捆绑工作(我建议HomeBrew)。如果includes是一个包含更多模块的软件包,那么您可以尝试packages而不是k.tk

答案 1 :(得分:0)

如果出于某种原因上述解决方案不起作用,请尝试添加一些第三方文件,这些文件由open(*, 'r')打开

将要打开的内容添加到data_files = [..]