Python应用打包为exe后跨目录运行的文件路径适配问题
Python跨运行目录及打包exe路径适配方案
核心逻辑
所有项目内文件路径统一锚定项目根目录的绝对路径,完全脱离当前运行工作目录的影响,同时兼容脚本直接运行、打包为exe两种使用场景。
具体实现步骤
1. 定义全局项目根路径
首先在main.py开头新增如下代码,自动识别当前运行环境,生成项目根目录的绝对路径:
import os import sys # 脚本运行时,取main.py所在core目录的上级目录作为项目根 BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) # 兼容打包为exe的场景:打包后sys.frozen属性为True,取exe所在目录作为项目根 if getattr(sys, 'frozen', False): BASE_DIR = os.path.dirname(sys.executable)
2. 选择一种路径适配方案即可
方案1:动态替换日志配置路径(推荐,无副作用)
不需要修改当前运行目录,通过logging配置的默认参数动态传入日志文件绝对路径:
- 修改
logging.ini中handler的路径参数为占位符:
[handler_fileHandler] class=FileHandler level=DEBUG formatter=json args=("%(log_path)s",'w')
- 修改日志初始化代码,动态传入日志文件绝对路径:
# 拼接日志文件绝对路径 log_path = os.path.join(BASE_DIR, "logs", "migration.log") # 加载配置时传入占位符对应的值 logging.config.fileConfig( os.path.join(BASE_DIR, "logging.ini"), defaults={"log_path": log_path}, disable_existing_loggers=False )
方案2:切换工作目录到项目根(改动最小)
直接将程序运行的工作目录切换到项目根,原有配置里的相对路径不需要做任何修改:
# 切换工作目录到项目根 os.chdir(BASE_DIR) # 原有日志初始化代码不需要修改,直接运行即可 logging.config.fileConfig("logging.ini", disable_existing_loggers=False)
3. 其他配置文件通用写法
后续读取项目内其他文件时,统一用BASE_DIR拼接绝对路径即可,不受运行目录影响:
# 读取用户配置 user_config_path = os.path.join(BASE_DIR, "config", "userconfig", "user.json") # 读取系统配置 system_config_path = os.path.join(BASE_DIR, "config", "systemconfig", "system.json")
打包exe注意事项
打包后将logs文件夹、config文件夹、logging.ini文件和生成的exe放在同一目录下即可正常运行;如果需要把文件打包进exe内部,使用pyinstaller时添加--add-data参数指定静态文件映射规则即可。
内容的提问来源于stack exchange,提问作者Saranraj K
相关产品推荐
相关产品推荐

