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

Python脚本经PyInstaller打包为EXE后如何修正工作目录异常?

解决PyInstaller打包EXE后找不到同目录文本文件的问题

问题根源

用os.path.dirname(os.path.abspath(__file__))获取路径无效,是因为PyInstaller打包后程序运行时会把脚本解压到AppData下的临时目录,__file__指向的是这个临时目录里的脚本文件,而非EXE所在的目录,所以切换工作目录会跳到错误路径。

正确解决方案

方案1:切换工作目录到EXE所在路径

通过sys.executable获取EXE文件的绝对路径,再提取其所在目录并切换:

import os
import sys

exe_dir = os.path.dirname(os.path.abspath(sys.executable))
os.chdir(exe_dir)

方案2:直接拼接资源绝对路径(更稳妥)

无需切换工作目录,直接生成文本文件的绝对路径,避免切换目录引发其他问题:

import os
import sys

def get_resource_path(relative_path):
    base_path = os.path.dirname(os.path.abspath(sys.executable))
    return os.path.join(base_path, relative_path)

# 读取同目录下的文本文件示例
txt_path = get_resource_path("your_file.txt")
with open(txt_path, "r", encoding="utf-8") as f:
    content = f.read()

方案3:适配打包/未打包两种场景(含资源打包进EXE)

如果需要把文本文件打包进EXE,需用PyInstaller的--add-data参数(Windows用;分隔路径,Linux/macOS用:):

pyinstaller --add-data "your_file.txt;." your_script.py

同时使用以下代码获取资源路径,兼容开发和打包后的场景:

import os
import sys

def get_resource_path(relative_path):
    try:
        # 打包后临时资源目录
        base_path = sys._MEIPASS
    except Exception:
        # 未打包时的脚本目录
        base_path = os.path.dirname(os.path.abspath(__file__))
    return os.path.join(base_path, relative_path)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:37:08