auto-py-to-exe/pyinstaller打包报base_library路径文件不存在错误
问题原因
PyInstaller 单文件(--onefile)模式打包的程序,启动时会把所有内置依赖、通过--add-data添加的资源解压到系统临时目录下的_MEIPASS专属文件夹中运行,并不会直接在exe所在目录读取资源。
你代码里用sys.path[0]拼接路径,在打包运行环境下这个值指向临时目录内的base_library.zip文件路径,根本不是附加资源的实际存放位置;同时你写的--add-data参数末尾分号后没有指定资源解压的目标目录,也会导致资源放置位置异常,最终触发文件找不到的报错。
解决方法
根据你实际的文件使用需求二选一即可:
- 场景1:需要把txt文件打包进exe内部,用户不需要单独修改这个txt
- 替换原有路径获取逻辑,写兼容开发/打包环境的通用路径方法,代码如下:
import os import sys def resource_path(relative_path): # 适配PyInstaller打包后的运行环境 if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) # 开发环境下直接返回脚本同目录的对应路径 return os.path.join(os.path.abspath(os.path.dirname(__file__)), relative_path) # 替换你原来的open路径写法 with open(resource_path("file.txt")) as f: # 保留你原有的文件读取逻辑 content = f.read() - 修正auto-py-to-exe的附加文件配置:添加file.txt时,目标路径填写
.,对应生成的--add-data参数在Windows下格式为C:/path/to/file.txt;.,不要留分号后的内容为空。
- 替换原有路径获取逻辑,写兼容开发/打包环境的通用路径方法,代码如下:
- 场景2:需要把txt放在exe同目录,方便后续直接修改内容不需要重新打包
- 不要把file.txt通过
--add-data参数添加到打包配置里。 - 路径获取逻辑替换为读取exe所在目录的写法,代码如下:
import os import sys if getattr(sys, 'frozen', False): # 打包后取exe文件自身所在目录 base_path = os.path.dirname(sys.executable) else: # 开发环境取脚本文件所在目录 base_path = os.path.abspath(os.path.dirname(__file__)) file_path = os.path.join(base_path, "file.txt") with open(file_path) as f: # 保留你原有的文件读取逻辑 content = f.read() - 打包完成后,把file.txt放到和生成的exe同层级的目录下即可正常运行。
- 不要把file.txt通过
内容的提问来源于stack exchange,提问作者Dovah Kiin
相关产品推荐
相关产品推荐

