PyInstaller打包Python脚本生成exe运行时找不到CSV文件问题求助
问题根源
报错本质是打包后程序无法找到csv资源文件,由两个错误共同导致:
- 代码使用硬编码固定路径,未适配PyInstaller打包后的运行环境:PyInstaller单文件模式运行时,会先把所有资源解压到系统临时目录的随机文件夹(运行时由
sys._MEIPASS变量指向该路径),写死的固定路径不可能匹配到这个随机生成的临时目录。 --add-data参数的目标路径配置错误,资源文件打包后的存放位置和代码读取路径不匹配。
解决步骤
1. 修改Python代码,添加动态资源路径适配逻辑
在代码开头新增路径处理逻辑,替换原来的硬编码路径,修改后完整代码如下:
import sys import os from pandas import read_csv def resource_path(relative_path): """获取资源绝对路径,同时适配开发环境和PyInstaller打包环境""" try: # PyInstaller运行时自动设置该变量,指向临时解压目录 base_path = sys._MEIPASS except Exception: # 本地开发环境下取当前脚本所在目录作为根路径 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) def csv_parser(path): a = read_csv(path, header=0, sep=";") return a # 替换原来的硬编码路径为动态获取的路径 volume_surfarea_table = csv_parser(resource_path(os.path.join("Tables", "Volume Area Table.csv"))) component_dr_table = csv_parser(resource_path(os.path.join("Tables", "Components DR Table.csv"))) def get_CF(): vsp = float(input("What's the VSP? ")) cf = vsp/5 rowN = 0 for x in range(64): if cf <= volume_surfarea_table.iloc[rowN,0]: hit_points = volume_surfarea_table.iloc[rowN,1] break rowN = rowN + 1 return hit_points def get_DR(): compo_type = input("What's the component type? ") compo_type = compo_type.title() rowN = 0 for x in range(6): if compo_type in component_dr_table.iloc[rowN,0]: compoDR = component_dr_table.iloc[rowN,1] break rowN = rowN + 1 return compoDR finished = "false" while finished == "false": hit_points = get_CF() compoDR = get_DR() compo_stats = f"""Your component has {hit_points}HP and a DR of {compoDR}.""" print(compo_stats) done = input("Are you finished? (y/n) ") if done == "y": finished = "true"
2. 修改PyInstaller打包命令
调整--add-data参数的目标路径,让资源文件打包后存放位置和代码读取路径匹配,Windows下命令如下:
pyinstaller -F --add-data "Tables\Volume Area Table.csv;Tables\" --add-data "Tables\Components DR Table.csv;Tables\" "Vehicles Calc.py"
如果是MacOS/Linux系统,将--add-data中的分号替换为冒号即可:
pyinstaller -F --add-data "Tables/Volume Area Table.csv:Tables/" --add-data "Tables/Components DR Table.csv:Tables/" "Vehicles Calc.py"
注意事项
- 打包前确认你的项目根目录下存在
Tables文件夹,且两个目标csv文件存放在该文件夹内 - 打包完成后生成的exe文件在
dist目录下,直接运行即可
内容的提问来源于stack exchange,提问作者AnFa
相关产品推荐
相关产品推荐

