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
相关产品推荐
相关产品推荐

