使用py2app打包pygame项目运行时报文件找不到错误如何解决
问题根源
你在开发环境能正常运行是因为Sublime执行代码时的工作目录就是你的项目根目录,直接写文件名的相对路径可以匹配到本地文件。但py2app打包后的.app程序运行时,所有资源文件会被放到Contents/Resources目录下,而可执行文件在Contents/MacOS目录下,默认工作目录和资源目录不一致,直接用相对路径就会触发文件找不到的错误。
修复步骤
- 第一步:在你的代码中添加动态获取资源路径的函数
在MainMenu.py以及主游戏模块的顶部加入以下代码:import sys import os def get_resource_path(relative_path): # 判断是否为打包后的运行环境 if getattr(sys, 'frozen', False): # 打包后资源文件存放在 Contents/Resources 目录 base_path = os.path.abspath(os.path.join(os.path.dirname(sys.executable), '..', 'Resources')) else: # 开发环境使用当前工作目录 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) - 第二步:修改所有资源加载的代码
所有加载图片、音效、字体的地方,都要调用上面的函数拼接路径,比如:
原来的写法:
修改为:screen_home = pygame.image.load('HomeScreen.png')
注意带文件夹的资源也要保持相对路径写法,比如:screen_home = pygame.image.load(get_resource_path('HomeScreen.png'))shoot_img = pygame.image.load(get_resource_path('MySprite/Shoot/1.png')) - 第三步:调整打包命令(可选但必要,如果你要发给朋友)
你之前用的-A参数是别名模式,生成的app仅能在你的本地电脑运行,依赖你本地的Python环境和项目文件。如果要生成可分享的独立app,打包时去掉-A参数即可:rm -rf build dist python3 setup.py py2app
排查小技巧
如果修改后依然报错,可以右键点击app选择「显示包内容」,进入Contents/Resources目录,确认对应的资源文件是否存在:
- 如果文件不存在,检查
setup.py中DATA_FILES的路径是否正确,注意macOS文件系统大小写敏感,路径大小写要和实际文件完全一致 - 如果文件存在,检查代码中调用
get_resource_path时传入的相对路径是否和DATA_FILES里写的路径完全匹配
内容的提问来源于stack exchange,提问作者Ahmed Mahmoud
相关产品推荐
相关产品推荐

