直接原因是当前工作目录(os.getcwd())与文件实际位置不匹配,open("config.json")按工作目录而非脚本目录解析相对路径;应使用os.path.abspath(__file__)定位脚本目录再拼接路径。

直接原因是 sys.path 或当前工作目录(os.getcwd())与文件实际位置不匹配,不是编码或权限问题,而是 Python 解释器“找不到你认为它该找的地方”。
为什么 open("config.json") 找不到文件
Python 的 open() 默认按**当前工作目录**(不是脚本所在目录,也不是虚拟环境根目录)解析相对路径。你在终端里 cd 到哪、用什么命令启动脚本,就决定了这个“当前目录”在哪。
- 在项目根目录执行
python src/main.py→ 当前目录是项目根,open("config.json")会找项目根下的config.json - 在
src/目录下执行python main.py→ 当前目录变成src/,open("config.json")就会去src/config.json找,自然失败 - VS Code 点击运行按钮时,它默认把工作目录设为打开的文件夹(即 workspace root),但如果你没打开整个项目文件夹,而是只打开了单个
.py文件,工作目录可能是临时路径或用户主目录
__file__ 是更可靠的路径锚点
脚本文件自身的位置(__file__)永远是确定的。用它构造绝对路径,能绕过工作目录干扰:
import os <h1>获取当前脚本所在目录</h1><p>script_dir = os.path.dirname(os.path.abspath(<strong>file</strong>)) config_path = os.path.join(script_dir, "config.json")</p><p>with open(config_path, "r", encoding="utf-8") as f: data = json.load(f)
注意:os.path.abspath(__file__) 必须用,因为 __file__ 可能是相对路径(比如通过 python -m 运行时);encoding="utf-8" 显式声明,避免 Windows 下默认 GBK 导致中文路径或内容乱码。
立即学习“Python免费学习笔记(深入)”;
VS Code 调试时工作目录容易被忽略
即使你代码用 __file__ 写对了,VS Code 的 launch.json 如果没配 "cwd",调试器仍可能在错误目录下启动子进程(比如调用外部命令、读取配置中的路径变量)。
- 检查
.vscode/launch.json是否有"cwd": "${workspaceFolder}"—— 没有就加上 - 如果项目结构是
project/src/app.py且配置文件在project/config/,那"cwd"应设为"${workspaceFolder}"(即project/),而不是"${fileDirname}" - 终端里手动测试:先
cd到你期望的工作目录,再运行python -m src.main,看是否还报错 —— 这能快速验证是不是工作目录惹的祸
虚拟环境本身不改变文件路径逻辑
.venv 只隔离包和解释器,它不会重写 os.getcwd() 或修改 open() 的路径解析规则。所有路径行为和系统 Python 完全一致。所谓“venv 下路径不对”,99% 是开发者误以为激活环境后工作目录自动切到项目根,或者混淆了脚本路径与工作目录。
最常被跳过的一步:运行前先确认 print(os.getcwd()) 和 print(__file__) ,两行输出比任何猜测都管用。



















