py2app构建的应用在其他机器上显示`ERROR: pygame.macosx import FAILED`

3 投票
2 回答
3544 浏览
提问于 2025-04-16 13:02

我在Mac上用py2app制作一个应用程序。我的机器上运行得很好,但当我把这个应用程序转移到另一台电脑上时,它崩溃了,控制台显示了这个错误。

错误:pygame.macosx 导入失败

有没有人知道怎么解决这个问题?

2 个回答

1

谢谢你分享你发现的内容!

我遇到过类似的问题。我尝试了你建议的各种组合,最后发现我遇到的唯一问题就是你提到的boot_app.py里的一个错误。

当我在boot_app.py中添加了你提到的那一行修复后,一切都正常了,甚至在使用预装的苹果版本的python(2.6.1)时也没问题。

我想说明的是,当我说“所有功能正常”时,我实际上是指为实际发布构建一个py2app应用,也就是使用正常的命令:

python setup.py py2app

这是“别名”模式,也就是

python setup.py py2app -A

py2app文档建议在开发过程中使用的模式,但对我来说,这个模式仍然不行(同样出现模块未找到的错误)。不过,能让实际发布的构建正常工作总比什么都不行要好!再次感谢你。

12

经过很多小时的努力,我终于找到了问题和解决方案。原来其他人也遇到过类似的问题,他们的文章对我帮助很大:

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 - 我最开始的问题是依赖于苹果自带的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

调整路径,安装包 - 接下来你需要调整路径,以确保你使用的是自己安装的版本。然后,我重新安装了以下几个包——这变成了一场依赖的噩梦,所以我也包括了版本号:

  • py2app 0.5.2
  • macholib 1.3
  • modulegraph .8.0

如果这些包真的能用,你现在应该可以构建并运行你的应用程序了。不幸的是,它们并不能用。我稍后会讲到错误和我的解决办法,但首先需要在构建文件里做一些设置。

首先,setup.py文件应该像这样:

setup.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脚本来调用这个。

build.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 not found - 这是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包里的一个bug,它无法确定你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'])

No such file or directory...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

这样就可以了! - 这些步骤创建了一个可以在其他Intel机器上运行的编译应用。

撰写回答