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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:52:49