VSCode调试Python时默认工作目录为${workspaceFolder}而非当前文件所在目录,导致相对路径报错;可通过launch.json设"cwd":"${fileDirname}"或用os.path.dirname(__file__)构建绝对路径解决。

VSCode 默认工作目录不是当前文件所在目录
VSCode 启动 Python 程序时,默认把 ${workspaceFolder}(即你打开的整个项目文件夹)设为当前工作目录(cwd),而不是 draw_chart.py 所在的 app_sample 目录。这意味着你在代码里写 ../pending_files/1836A.xlsx,实际是在从项目根目录往上找,自然会报 FileNotFoundError。
常见错误现象:
- 直接点击右上角 ▶️ 运行按钮,路径报错;但用终端手动
cd app_sample && python draw_chart.py却能成功 -
os.getcwd()打印出来是E:/code/Python_project,而非E:/code/Python_project/app_sample
解决思路有两个方向:改 IDE 行为,或改代码逻辑。前者快但有环境依赖,后者稍多一行代码但可移植性强。
用 launch.json 固定 cwd 到当前文件目录
这是最直接、不改代码的方案。VSCode 的调试器支持通过 launch.json 显式指定工作目录,让 cwd 跟着当前文件走。
操作步骤:
- 确保项目根目录下有
.vscode/launch.json(没有就按Ctrl+Shift+P→ 输入 “Debug: Open launch.json” 创建) - 在配置中加入
"cwd": "${fileDirname}",例如:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"module": "runpy",
"args": ["-m", "${fileBasenameNoExtension}"],
"console": "integratedTerminal",
"justMyCode": true,
"cwd": "${fileDirname}"
}
]
}
注意:必须通过 Debug 面板或 Ctrl+F5 启动调试才能生效;右上角绿色 ▶️ 按钮不会读取该配置。
用 os.path.dirname(__file__) 构建脚本级绝对路径
这是推荐的长期做法。它不依赖 VSCode 设置,无论你用命令行、PyCharm 还是 CI 环境运行,路径都稳定可靠。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
关键点:
-
__file__永远指向当前 Python 文件的完整路径 -
os.path.dirname(__file__)就是这个文件所在的目录 - 用
os.path.join()拼接子路径,自动处理/和\差异
示例(替换你原来的 file_path = f"../pending_files/{chart_title}.xlsx"):
import os
chart_title = '1836A'
current_dir = os.path.dirname(__file__)
file_path = os.path.join(current_dir, '..', 'pending_files', f'{chart_title}.xlsx')
# 或更安全地规范化:
file_path = os.path.normpath(file_path)
如果你只是读同级或子目录下的文件,甚至可以简化为:
file_path = os.path.join(os.path.dirname(__file__), 'config.json')
模块导入 vs 文件读取,别混用同一套相对路径逻辑
很多人卡在“为什么 from utils import helper 不报错,但 open('data.txt') 却找不到文件?”——因为 Python 的 import 查找靠 sys.path,而 open() 靠的是当前工作目录(cwd)。两者机制完全不同。
典型陷阱:
- 只配了
PYTHONPATH解决 import,却忘了cwd还是错的,导致文件操作失败 - 开了
"python.terminal.executeInFileDir": true,结果import从脚本目录开始搜,反而找不到项目根下的包
所以:如果项目同时有模块导入和文件读取需求,优先用 os.path.dirname(__file__) 处理文件路径;模块导入则统一用项目根为基准(比如配 PYTHONPATH 或 sys.path.insert(0, project_root)),不要指望一个 ../ 同时满足两者。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










