PyInstaller打包--onefile后获取可执行文件路径的问题
解决PyInstaller --onefile打包后获取可执行文件所在目录的问题
当用PyInstaller的--onefile参数打包Python脚本时,程序运行会先把自身解压到系统临时目录,此时__file__指向的是临时目录里的脚本副本,而非你实际运行的可执行文件所在路径——这就是原路径方法失效的核心原因。
直接用以下代码即可正确获取可执行文件所在目录:
import sys from pathlib import Path def get_app_dir(): # 检测是否为PyInstaller打包后的运行环境 if getattr(sys, 'frozen', False): # 打包后sys.executable指向生成的可执行文件本身 return Path(sys.executable).resolve().parent # 非打包环境,返回脚本所在目录 return Path(__file__).resolve().parent # 使用示例 basepath = get_app_dir() filepath = basepath / "myfile" # 用pathlib语法更简洁统一
关键说明
sys.frozen是PyInstaller为打包程序额外添加的属性,用来区分打包环境和普通Python运行环境- 打包后
sys.executable不再指向Python解释器,而是指向你生成的可执行文件,通过它能拿到正确的可执行文件路径,取父目录就是目标目录 - 之前尝试的
os.realpath(__file__)无效,是因为打包后__file__指向临时目录中的解压文件,解析后还是临时路径,和可执行文件实际位置无关
内容的提问来源于stack exchange,提问作者Eidern
相关产品推荐
相关产品推荐

