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 項目更加穩定健壯。如果你也踩過類似的坑,歡迎留言交流!