使用PyInstaller/Auto Py to Exe时如何处理相对资源路径?
解决PyInstaller打包后相对路径找不到文件的问题
问题根源
开发时你用../resources/outkitsapicall.log这类相对路径,是基于当前工作目录定位到ProjectFolder/resources的。但PyInstaller打包后,exe位于output/main目录,运行时的工作目录不一定是exe所在目录(比如双击exe时工作目录可能是用户桌面),导致../resources会指向不存在的output/resources,触发FileNotFoundError。
解决方案
通过获取exe的绝对路径构建目标路径,不管运行时工作目录在哪都能准确定位,同时满足“输出到exe所在main文件夹之外的目录”的需求:
- 导入必要模块
在main.py开头添加:
import os import sys import logging
- 获取exe的实际目录
编写代码判断当前是开发环境还是打包后的环境,获取exe所在目录:
# 获取当前执行文件的目录 if getattr(sys, 'frozen', False): # 打包为exe后的情况 exe_dir = os.path.dirname(sys.executable) else: # 开发环境下的情况 exe_dir = os.path.dirname(os.path.abspath(__file__))
- 构建目标资源目录并确保存在
要把输出文件放到output/resources(main文件夹的上级目录下的resources),代码如下:
# 构建output/resources的路径 resources_dir = os.path.join(os.path.dirname(exe_dir), 'resources') # 确保目录存在,不存在则自动创建 os.makedirs(resources_dir, exist_ok=True)
- 初始化日志文件处理器
用构建好的绝对路径初始化FileHandler:
log_file_path = os.path.join(resources_dir, 'outkitsapicall.log') file_handler = logging.FileHandler(log_file_path, mode='w', encoding='utf-8')
额外说明
- 这段代码同时兼容开发环境和打包后的环境:开发时exe_dir是
src目录,os.path.dirname(exe_dir)就是ProjectFolder,最终会定位到原来的resources目录,无需修改代码切换环境。 os.makedirs(..., exist_ok=True)避免因目标目录不存在导致的报错,会自动创建所需层级的目录。
内容的提问来源于stack exchange,提问作者ss301
相关产品推荐
相关产品推荐

