Python 中的 os.path.exists()__file__ 使用陷阱:工作目录 ≠ 脚本目录

在使用 os.path.exists()open() 等函数操作文件路径时,笔者常常忽略一个关键概念:当前运行目录(Current Working Directory, CWD)并不等于当前脚本所在目录(Script Location)

这一点如果不搞清楚,很容易导致路径错误或 FileNotFoundError 异常,特别是在大型项目或 Web 框架(如 FastAPI)中。


❓ 问题背景

考虑如下代码:

import os

save_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 os

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

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐