vs code中python脚本运行报filenotfounderror,根本原因是默认工作目录为项目根目录而非脚本所在目录;推荐用pathlib.path(__file__).parent / "config.json"精准定位配置文件,或在launch.json中配置"cwd": "${filedirname}"。

直接运行会报错 FileNotFoundError 或 PermissionError,因为默认工作目录不是你预期的配置文件所在位置——VS Code 的终端启动时 cwd 是当前打开的文件夹(workspace root),而不是当前文件所在目录。
为什么 open("config.json") 总是找不到文件
Python、Node.js、Rust 等语言中用相对路径读配置,本质依赖当前工作目录(cwd)。VS Code 默认把 workspace root 当作 cwd,哪怕你双击打开的是 src/main.py,终端启动后 pwd 仍是项目根目录,不是 src/。如果 config.json 放在 src/ 下,而代码里写 open("config.json"),就会失败。
- 验证方式:在代码开头加
import os; print(os.getcwd()),运行看输出 - 常见错误现象:
FileNotFoundError: [Errno 2] No such file or directory: 'config.json' - 不是权限问题,也不是路径拼错,是 cwd 和你直觉不一致
三种可靠做法:改路径、改 cwd、或用 __file__ 定位
别硬靠手动 cd 切目录,容易漏或误操作。优先用代码自身定位:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- Python 推荐用
pathlib.Path(__file__).parent / "config.json",__file__永远指向当前脚本路径,.parent就是同级目录,安全又明确 - Node.js 用
path.join(path.dirname(__filename), "config.json") - 如果必须改工作目录(比如 legacy 脚本不能动),可在
tasks.json的"options": {"cwd": "${fileDirname}"}强制设为当前文件所在目录 - 不建议在终端里手动
cd src && python main.py,VS Code 的“运行”按钮和快捷键不会执行这步
Live Server 和 Python 扩展对 cwd 的处理差异
HTML + Live Server 插件启动的服务,其静态资源解析路径基于服务器根目录(即 index.html 所在目录),但 fetch 请求的 base URL 仍是 http://127.0.0.1:5500/,所以 fetch("config.json") 实际请求的是 http://127.0.0.1:5500/config.json,不是本地文件系统路径——这里容易混淆“读取配置”的上下文。
- 前端 JS 的
fetch是网络请求,跟os.getcwd()无关;后端 Python 的open()是文件系统操作,严格依赖cwd或绝对路径 - Python 扩展右上角 ▶ 运行时,
cwd固定为 workspace root;Code Runner 插件默认也是 workspace root,但可在设置里改"code-runner.cwd": "$fileDirname" - 调试模式(
launch.json)可通过"cwd": "${fileDirname}"精确控制,但非调试运行不走这个逻辑
多层级项目中配置文件位置混乱怎么办
比如你有 project/config/app.yaml 和 project/src/main.py,且 main.py 需要读 ../config/app.yaml。这时硬编码 ../config/... 易出错,也难迁移。
- 更健壮的做法:在
main.py开头统一定义配置根目录,例如CONFIG_ROOT = Path(__file__).parent.parent / "config" - 避免用
os.chdir()动态切目录,会影响后续所有相对路径操作,包括日志写入、临时文件生成等 - 如果用环境变量(如
CONFIG_PATH),记得在tasks.json或launch.json中通过"env"注入,终端直接运行时需手动export CONFIG_PATH=...
最常被忽略的一点:VS Code 的“运行”行为(右上角 ▶、Ctrl+Shift+P → Run Without Debugging)完全不读 launch.json,只认 tasks.json 或插件默认逻辑。想让配置文件路径稳定,要么改代码用 __file__ 定位,要么改插件设置或任务配置——别指望它自动猜你想要的工作目录。










