
本文介绍两种可靠方式:一是通过配置 launch.json 实现调试与运行时统一设置工作目录;二是通过代码动态切换工作目录,确保脚本在任意环境下行为一致。
本文介绍两种可靠方式:一是通过配置 launch.json 实现调试与运行时统一设置工作目录;二是通过代码动态切换工作目录,确保脚本在任意环境下行为一致。
在 VS Code 中运行 Python 脚本时,默认工作目录为当前工作区根目录(workspace folder),而非脚本所在目录。这常导致相对路径导入失败、文件读写异常或模块加载错误——尤其当脚本依赖同级资源(如配置文件、数据目录或本地包)时。幸运的是,VS Code 提供了灵活的配置机制,结合代码级兜底方案,可彻底解决该问题。
✅ 方式一:通过 launch.json 统一配置工作目录(推荐用于开发/调试)
VS Code 的 Python 扩展支持在 launch.json 中为“运行”和“调试”共用同一套配置。即使不设断点,也可通过 F5 或 Run → Start Debugging 以指定工作目录执行脚本(本质是启动带参数的 Python 进程,非简单 python main.py)。
- 在项目根目录下创建或打开 .vscode/launch.json(若不存在,可通过 Run → Add Configuration… → Python: Current File 自动生成);
- 修改对应配置,添加 "cwd" 字段:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File (Custom CWD)",
"type": "python",
"request": "launch",
"module": "python",
"args": ["${file}"],
"cwd": "${fileDirname}", // ← 关键:设为当前脚本所在目录
"console": "integratedTerminal",
"justMyCode": true
}
]
}- "cwd": "${fileDirname}" 表示将工作目录设为当前打开的 .py 文件所在目录;
- 支持变量:${workspaceFolder}(工作区根)、${file}(完整文件路径)、${fileBasenameNoExtension} 等;
- 如需传参,在 "args" 中添加,例如 "args": ["${file}", "--verbose", "config.yaml"]。
⚠️ 注意:此方式仅影响通过调试器启动的进程(即 F5 或点击「运行」按钮)。终端中直接执行 python main.py 仍使用终端当前路径,不受此配置影响。
✅ 方式二:代码级固化工作目录(推荐用于生产/跨环境部署)
若脚本需被他人在任意路径下直接调用(如 python /path/to/main.py),或需保证行为与 IDE 无关,则应在脚本开头主动切换工作目录:
立即学习“Python免费学习笔记(深入)”;
import os
import sys
# 将工作目录切换至当前脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir)
# (可选)优先导入当前目录下的模块
if script_dir not in sys.path:
sys.path.insert(0, script_dir)- os.path.abspath(__file__) 获取脚本绝对路径,os.path.dirname() 提取其所在目录;
- os.chdir() 立即生效,后续所有相对路径操作(如 open("data.csv"))均以此为准;
- sys.path.insert(0, ...) 确保同目录下的 .py 模块能被优先导入,避免与系统或虚拟环境中同名模块冲突。
? 最佳实践建议
- 开发阶段:优先使用 launch.json 配置 cwd,便于调试与快速验证;
- 交付/部署阶段:务必在入口脚本中加入 os.chdir(...) 逻辑,消除环境依赖;
- 避免混合路径风险:不要混用 os.getcwd() 和 __file__ 相对路径;统一基于 __file__ 构建路径更健壮;
- 若项目结构复杂(如多级子包),可进一步结合 pathlib.Path(__file__).parent.resolve() 提升可读性与跨平台兼容性。
通过以上两种方式协同使用,即可在 VS Code 中精准控制 Python 脚本的工作目录,兼顾开发效率与运行可靠性。


















