尝试使用 py2app 在 Mac 上构建应用程序。在我的机器上一切正常,但是当将应用程序移动到另一个应用程序时,它崩溃并且控制台显示此错误。
ERROR: pygame.macosx import FAILED
有人对此有解决方案吗?
几个小时后发现问题和解决方案。原来其他人也遇到过类似的问题,他们的文章很有帮助:
http://b.atcg.us/blog/2010/04/13/py2app-hell-the-first.html
http://www.vijayp.ca/blog/?p=62
万一其他人遇到这个问题,这个特定的问题是由于 Python 框架没有被捆绑到应用程序中而引起的。您可以通过右键单击您的应用程序以查看包内容来确认这一点,然后继续到 Contents/Frameworks/。如果 Python.framework 不存在,它应该存在。
请务必下载 Python - 我的第一个问题是依赖 Apple 的内置 Python 包。不要使用这个。您需要安装自己的 python 版本。转到http://www.python.org/download/releases/,找到一个版本(我坚持使用 2.6),下载 gzip(不是 mac 包),如果您正在运行 Snow Leopard,请使用以下内容进行安装:
./configure --enable-framework MACOSX_DEPLOYMENT_TARGET=10.6 --with-universal-archs=intel --enable-universalsdk=/
make
sudo make install
调整路径,安装包- 从这里您需要调整路径以确保您使用的是自定义安装的版本。从这里,我重新安装了以下软件包——结果证明这是一个依赖关系的噩梦,所以我也包括了版本号:
如果这些包确实有效,您现在应该能够构建和运行您的应用程序。不幸的是,他们没有。稍后我将介绍错误和我被黑的解决方案,但是需要首先在构建文件中进行一些设置。
首先 setup.py 文件应该有点像这样:
安装程序.py
from setuptools import setup
APP = ['Game.py']
DATA_FILES = ['data']
OPTIONS = {
"argv_emulation": False,
"compressed" : True,
"optimize":2,
"iconfile":'data/game.icns',
}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
)
然后为了更加安全,我使用 shell 脚本来调用它。
构建.sh
## Remove previous builds. Start with clean slate.
rm -rf build dist
## Force python into 32 bit mode.
export VERSIONER_PYTHON_PREFER_32_BIT=yes
## Force build with custom installed python
/Library/Frameworks/Python.framework/Versions/2.6/bin/python setup.py py2app
运行 build.sh 应该编译应用程序。如果它没有编译,我有一个好消息——这不是你的错。由于库中的故障,您可能会遇到以下部分(或全部)问题:
潜在问题 如果构建脚本失败,请扫描回溯以查找以下一些关键字:
找不到 pygame - py2app 中的基本路径问题。添加...
sys.path.insert(0, os.path.join(os.getcwd(), 'lib', 'python2.6','lib-dynload')) ## Added to fix dynlib bug
在 py2app 库中boot_app.py中的 import 语句之后。
pythonNone - 这似乎是 macho 包中的一个错误,它无法确定你的 python 构建的版本号。为了解决这个问题,我在py2app中的 build_app.py 中添加了以下几行。
## Add these two lines...
if not info["version"]:
info["version"] = "2.6"
## Before this line. (line 941 in method copy_python_framework() at time of writing)
pydir = 'python%s'%(info['version'])
没有这样的文件或目录...Python.framework/[lib|include] - py2app 只是在寻找存在于文件系统树更深处的目录。转到 Python.framework 目录并符号链接该位置...
cd /Library/Frameworks/Python.framework
sudo ln -s Versions/Current/include/ include
sudo ln -s Versions/Current/lib lib
应该这样做!- 这些步骤创建了一个可在其他英特尔机器上运行的编译应用程序。
感谢您发布您发现的内容!
我有一个类似的问题。我尝试了您建议的各种组合,并将单个问题隔离为您在上面确定的boot_app.py中的错误。
一旦我将单行修复添加到您在上面确定的 boot_app.py 中,一切正常,即使使用预安装的 Apple 构建的 python(版本 2.6.1)。
我应该注意,当我说“一切正常”时,我的意思是为实际分发构建一个 py2app 应用程序,即使用普通命令:
python setup.py py2app
“别名”模式。IE
python setup.py py2app -A
py2app 文档建议在开发过程中使用,但对我仍然不起作用(相同的模块未找到错误)。但是,实际的发行版构建总比什么都没有好!再次,谢谢。