为何VSCode中Python终端与编译为exe后的路径输出不同?
为何Python脚本直接运行与打包成exe后路径输出存在差异
先看你的代码和运行输出:
你在C:\Work\Python Scripts\dfr_monthly\myfile.py中的代码:
print(os.getcwd()) print(os.path.dirname(__file__))
VSCode运行时输出:
(base) C:\Work>C:/Users/coco/Anaconda3/python.exe "c:/Work/Python Scripts/dfr_monthly/myfile.py" C:\Work c:\Work\Python Scripts\dfr_monthly
打包成exe运行时,os.getcwd()会显示exe的启动工作目录,而os.path.dirname(__file__)会指向系统临时解压目录(如截图中类似C:\Users\coco\AppData\Local\Temp\_MEIxxxxxx的路径)。
差异的核心原因在于两个函数的定义,以及exe打包工具的运行机制:
1. os.getcwd():获取当前工作目录
这个函数返回的是你启动程序时所在的目录,而非程序文件本身的目录:
- 在VSCode中运行时,VSCode默认将你打开的根目录(此处为
C:\Work)作为工作目录,因此输出C:\Work。 - 双击exe运行时,工作目录默认是exe文件所在的目录(比如把exe放在桌面,工作目录就是桌面路径);如果从命令行cd到某目录再运行exe,工作目录就是该命令行目录。
2. os.path.dirname(__file__):获取脚本文件所在目录
这个函数依赖__file__变量的值:
- 直接运行py脚本时,
__file__是当前脚本的实际磁盘路径(如c:/Work/Python Scripts/dfr_monthly/myfile.py),因此os.path.dirname(__file__)能正确返回脚本所在目录。 - 当用PyInstaller等工具打包成exe时,程序会被压缩为单个文件,运行时自动解压到系统临时目录(如
AppData\Local\Temp下的随机命名文件夹),此时__file__指向临时目录中解压后的脚本文件,所以os.path.dirname(__file__)返回的是临时目录路径,而非原脚本目录。
解决办法:获取程序实际所在目录
如果需要在两种运行方式下都获取程序文件的真实目录,可以使用以下代码:
import os import sys def get_program_dir(): if getattr(sys, 'frozen', False): # 处于打包成exe的状态 return os.path.dirname(sys.executable) else: # 直接运行py脚本的状态 return os.path.dirname(os.path.abspath(__file__)) # 测试输出 print(get_program_dir())
这段代码会判断当前是否为打包后的exe运行状态:
- 打包时,
sys.executable指向exe文件的路径,取dirname即可得到exe所在目录。 - 直接运行脚本时,
os.path.abspath(__file__)确保获取脚本的绝对路径,再取dirname得到脚本所在目录。
内容的提问来源于stack exchange,提问作者random student
相关产品推荐
相关产品推荐

