【问题标题】:py2app with user packages带有用户包的 py2app
【发布时间】: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.tkOPTIONS = {'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


【解决方案1】:

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

【讨论】:

  • 修复了它。我使用these instructions 安装了自制python,并将OPTIONS = {'argv_emulation': True, 'includes': ['k.tk']} 更改为OPTIONS = {'argv_emulation': True, 'packages': ['k', 'k.tk']}
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2012-06-07
    相关资源
    最近更新 更多