Python 带有用户包的py2app
我正在从事一个小型的跨平台python项目。我想将文件扩展名与程序关联起来,因此对于OSX来说,脚本似乎必须成为一个应用程序。py2app似乎是完成这项工作的完美工具,但我很难找到关于它的好文档 我的python脚本依赖于我编写的包(Python 带有用户包的py2app,python,python-2.7,py2exe,py2app,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 genera
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时,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的文件夹中。现在,错误消息中给出的路径是一个目录,应用程序运行正常
有人知道如何解决这个问题吗?我感到很困惑,我能找到的唯一文档是,它似乎非常有限
更新
我尝试将/Library/Python/2.7/site packages/k
目录复制到项目目录中。这修复了别名构建,但不幸的是,没有修复完整构建
我还尝试按照Python文档()中的说明进行正确的打包和安装。这也产生了同样的效果。我感到很沮丧;为什么它会试图在zip文件中查看,好像它是一个文件夹
更新
最后我编写了一个构建脚本,它只是用一个同名的目录覆盖了zip。这解决了问题,但我对解决方案不满意
我还开始尝试使用py2exe为Windows构建。在Windows中,我遇到了完全相同的问题!此时将创建library.zip,必须将其解压缩才能运行程序。当然,这些程序并不是碰巧有相同的错误,但我无法想象为什么它们都错误地期望zip文件可以像文件夹一样访问。
py2app
需要一个单独的Python安装,而不是系统Python才能使捆绑包工作(我建议HomeBrew
)。另外,如果k.tk
是一个包含更多模块的包,而不是includes
,您可以尝试packages
。如果由于某种原因上述解决方案不起作用,请尝试添加第三方包通过open(*,'r')
将他们想要打开的内容添加到数据文件中=[..]您是否尝试过
包含“:['k”,“k.tk']
?我在这行中包含了k.tk
:OPTIONS={'argv\u仿真]:True,'includes':['k.tk']}
。我尝试将其更改为OPTIONS={'argv_仿真:True',includes':['k',k.tk']}
,但问题仍然存在。系统Python中是否存在k
?您需要安装另一个Python包才能正常工作,例如,HomeBrew
。我相信我使用的是系统Python。py2app不能使用系统Python?我相信它不会独立构建任何系统库,但别名模式我不确定。这就解决了它。我使用安装了自制python,并将OPTIONS={'argv_仿真:True',includes':['k.tk']}
更改为OPTIONS={'argv_仿真:True',packages':['k',k.tk']}
。