PyInstaller使用--onefile打包后如何读取外部配置文件?
解决PyInstaller --onefile打包后读取外部配置文件的问题
问题原因
使用pyinstaller --onefile打包时,生成的exe运行会自动将内部资源解压到系统临时目录,程序中默认的相对路径会指向这个临时目录,而非exe实际所在的文件夹,因此找不到外部的reader/conf.ini。
解决方案
方法1:动态获取exe实际运行目录(推荐)
修改main.py中读取配置文件的路径逻辑,通过判断打包环境,获取exe所在的真实目录,再拼接配置文件路径:
import os import sys def get_conf_path(): # 判断是否处于PyInstaller打包后的运行环境 if hasattr(sys, '_MEIPASS'): # 打包后,获取exe所在的绝对目录 exe_dir = os.path.dirname(os.path.abspath(sys.executable)) else: # 开发环境下,main.py在Src目录,回到上一级找reader文件夹 exe_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 拼接配置文件的完整路径 return os.path.join(exe_dir, 'reader', 'conf.ini') # 使用该路径读取配置文件 conf_file = get_conf_path() # 后续读取conf.ini的代码替换为这个路径
修改后,无论是否用--onefile打包,程序都会正确定位到exe所在目录下的reader/conf.ini。
方法2:通过spec文件控制资源路径(可选)
如果需要打包时默认携带配置文件,同时支持外部替换,可通过编辑spec文件实现:
- 先生成spec文件:
pyinstaller --onefile --specpath . Src/main.py
- 打开生成的
main.spec,在Analysis的datas参数中添加配置文件映射:
a = Analysis( ['Src/main.py'], pathex=[], binaries=[], datas=[('reader/conf.ini', 'reader')], # 格式:(源文件相对路径, 目标目录名) ... # 其他参数保持不变 )
- 用spec文件重新打包:
pyinstaller main.spec
这种方式会把reader/conf.ini打包进exe,运行时解压到临时目录的reader文件夹;若exe同目录下存在reader/conf.ini,方法1的代码会优先读取外部配置,实现自定义需求。
内容的提问来源于stack exchange,提问作者AMen
相关产品推荐
相关产品推荐

