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 项目更加稳定健壮。如果你也踩过类似的坑,欢迎留言交流!