Python 中的 os.path.exists() 和 __file__ 使用陷阱:工作目录 ≠ 脚本目录
在使用 os.path.exists() 或 open() 等函数操作文件路径时,笔者常常忽略一个关键概念:当前运行目录(Current Working Directory, CWD)并不等于当前脚本所在目录(Script Location)。
这一点如果不搞清楚,很容易导致路径错误或 FileNotFoundError 异常,特别是在大型项目或 Web 框架(如 FastAPI)中。
❓ 问题背景
考虑如下代码:
import ossave_dir = "imgs"
if not os.path.exists(save_dir):os.mkdir(save_dir)
表面看起来,它的目的是判断当前目录下是否存在 imgs/ 文件夹,如果没有则创建。但这个“当前目录”指的是 哪儿 呢?
⚠️ 实际行为:os.path.exists("imgs") 判断的是运行时工作目录
Python 执行 os.path.exists("imgs") 时,其实是从当前运行脚本的工作目录出发查找的。
这个工作目录通常是 运行 Python 程序的位置,也就是在终端或 IDE 中点击运行时所在的路径。
例如:
your_project/
├── main.py
└── submodule/└── handler.py
在 handler.py 中写了上述创建目录代码:
# handler.py
import osif not os.path.exists("imgs"):os.mkdir("imgs")
你在项目根目录运行:
python main.py
那么 imgs/ 会被创建在 your_project/ 下,而不是 submodule/ 下!
✅ 正确做法:基于脚本所在目录处理路径
如果你希望确保路径是相对于当前 Python 文件所在的位置,请使用 __file__:
import os# 当前脚本文件所在目录
base_dir = os.path.dirname(__file__)
save_dir = os.path.join(base_dir, "imgs")# 确保目录存在
if not os.path.exists(save_dir):os.mkdir(save_dir)
这样无论你从哪里运行程序,目录都始终会创建在 handler.py 所在位置。
🧠 总结
| 路径写法 | 判断位置 | 推荐使用场景 |
|---|---|---|
os.path.exists("imgs") | 当前工作目录(运行入口位置) | 快速测试、小脚本 |
os.path.join(os.path.dirname(__file__), "imgs") | 当前脚本所在目录 | 模块化项目、Web服务、分层结构 |
🚀 建议
- 对于 Web 框架(如 Flask/FastAPI)、多模块项目,可以优先使用
__file__; - 在调试路径问题时,打印一下
os.getcwd()【当前工作目录,即启动 Python 解释器时所在的目录】 和__file__【当前 Python 文件所在目录】,对照确认路径来源; - 永远不要假设当前目录就是你想要的路径。
希望这篇文章能帮你避开常见的路径陷阱,让你的 Python 项目更加稳定健壮。如果你也踩过类似的坑,欢迎留言交流!