You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件实现:

  1. 先生成spec文件:
pyinstaller --onefile --specpath . Src/main.py
  1. 打开生成的main.spec,在Analysis的datas参数中添加配置文件映射:
a = Analysis(
    ['Src/main.py'],
    pathex=[],
    binaries=[],
    datas=[('reader/conf.ini', 'reader')],  # 格式:(源文件相对路径, 目标目录名)
    ...  # 其他参数保持不变
)
  1. 用spec文件重新打包:
pyinstaller main.spec

这种方式会把reader/conf.ini打包进exe,运行时解压到临时目录的reader文件夹;若exe同目录下存在reader/conf.ini,方法1的代码会优先读取外部配置,实现自定义需求。

内容的提问来源于stack exchange,提问作者AMen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:45:31