使用pygame与pyinstaller打包exe时报错:期望字符串、字节或路径对象而非BytesIO
问题解决方法
这个报错的核心原因是程序运行时无法正确定位assets目录下的资源文件,可通过以下两种方案解决:
方案1:将assets资源内置到exe(推荐,仅需单文件分发)
- 第一步:修改代码中的资源路径获取逻辑,动态适配开发环境和打包后运行环境,示例代码如下:
import os import sys def get_resource_path(relative_path): # 打包后运行时读取pyinstaller临时解压目录,开发时读取当前脚本所在目录 if getattr(sys, 'frozen', False): base_path = sys._MEIPASS else: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path)
所有资源加载都通过该函数拼接路径,比如加载图片写为:pygame.image.load(get_resource_path("assets/xxx.png"))
- 第二步:修改打包命令,添加参数将assets目录打包进exe:
Windows系统执行:pyinstaller [目标文件] --onefile --noconsole --add-data "assets;assets"
Mac/Linux系统执行:pyinstaller [目标文件] --onefile --noconsole --add-data "assets:assets"
打包完成后仅需分发生成的单个exe文件即可,不需要额外携带assets文件夹。
方案2:保持assets外置,与exe同级运行
- 第一步:调整路径获取逻辑,打包后优先读取exe所在目录:
import os import sys def get_resource_path(relative_path): if getattr(sys, 'frozen', False): # 获取exe文件所在的文件夹路径 base_path = os.path.dirname(sys.executable) else: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path)
- 第二步:用原命令打包后,将生成的exe和assets文件夹放在同一级目录即可正常运行。
排查问题小技巧:你可以先去掉打包命令中的
--noconsole参数,生成带控制台的版本,运行时可以看到具体的资源加载报错信息,方便快速定位问题。
内容的提问来源于stack exchange,提问作者lomstfer
相关产品推荐
相关产品推荐

