淺談Python 中的當前工作目錄與腳本目錄

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87676.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87676.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS檢測并阻止騷擾電話的方法

檢測并阻止騷擾電話 你可以在 iPhone 上使用“將未知來電者設置為靜音”或第三方 App 來阻止騷擾電話。 打開“將未知來電者設置為靜音” 在 iOS 13 及更高版本中,你可以打開“靜音未知來電”,以免接到陌生人的來電。這一功能可以阻止那些你從未聯系過…

TensorFlow源碼深度閱讀指南

TensorFlow源碼深度閱讀指南 本文基于《TensorFlow內核剖析》附錄A的代碼閱讀方法論,結合實例解析核心源碼閱讀技巧(含關鍵圖示):一、源碼閱讀的四個維度 1. 分層切入策略(圖A-1) #mermaid-svg-ooLMzaWU5ky…

設計模式-責任鏈模式、策略模式

責任鏈模式 Chain of Responsibility(職責鏈)—對象行為型模式定義:使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有對象…

泛微e-cology remarkOperate遠程命令執行漏洞

【高危】泛微e-cology remarkOperate遠程命令執行漏洞 漏洞描述 泛微e-cology是泛微公司開發的協同管理應用平臺。 受影響版本中,接口 /api/workflow/reqform/remarkOperate 存在 SQL 注入漏洞,multipart 類型參數 requestid 直接拼接進 SQL 語句&…

Redis常用操作

1:redis常用操作: package com.shunaier.hhhh.biz.utils;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.shunaier.hhhh.common.enums.SystemErrorEnum; import com.shunaier.hhhh.common.exception.SNEB…

mybatis-plus-01-環境初始化及簡單應用

文章目錄 【README】【1】springboot集成mybatis-plus配置【1.1】目錄結構【相關說明】 【1.2】代碼示例【pom.xml】【application.properties】【MybatisPlusNoteController】【UserAppService】【UserMapper】【UserPO】【建表語句】 【2】演示 【README】 本文代碼參見&…

VR小鼠解剖虛擬仿真:開啟生命科學教育新視野?

VR 小鼠解剖虛擬仿真,是一項將虛擬現實(VR)技術深度融入小鼠解剖學習與研究過程的創新應用,即 VR 小鼠解剖虛擬仿真。其核心原理在于,借助 VR 技術所構建的高度逼真的虛擬環境,突破了傳統小鼠解剖在時間、空間以及實體操作上的諸多…

計算機網絡(網頁顯示過程,TCP三次握手,HTTP1.0,1.1,2.0,3.0,JWT cookie)

前言 最近一直在后端開發的面經🙌,里面涉及到了好多計算機網絡的知識😁,在這里以問題的形式寫一個學習筆記(其中參考了: JavaGuide 和 小林coding 這兩個很好的學習網站😘) 1.當鍵入網址后&am…

Redis 消息的發布和訂閱

Redis 消息的發布和訂閱 1、什么是發布和訂閱 Redis 發布訂閱 (pub/sub) 是一種消息通信模式:發送者 (pub) 發送消息,訂閱者 (sub) 接收消息。 Redis 客戶端可以訂閱任意數量的頻道。 2、Redis的發布和訂閱示意 1、客戶端可以訂閱頻道如下圖 2、當…

python優先隊列使用

heapq 是 Python 的一個內置模塊,提供了堆隊列算法的實現,也稱為優先隊列算法。以下是關于 heapq 模塊的詳細使用說明。 基本概念 堆:一種特殊的二叉樹結構,滿足父節點總是小于或等于其子節點(最小堆)特性…

在 Windows 機器上安裝和配置 RabbitMQ

RabbitMQ 它是一款基于 AMQP(高級消息隊列協議)的流行消息代理。RabbitMQ 適用于 Windows、Linux 和 macOS,易于安裝和使用,并提供一系列強大的消息隊列和路由功能。要在 Windows 計算機上使用 RabbitMQ,您必須先安裝 …

第十五節:第六部分:日志技術:logback的核心配置文件詳解、日志級別

核心配置文件logback.xml 什么是日志級別,為什么要學日志級別

從入門到精通:數據庫全攻略

目錄一、數據庫基礎概念1.1 數據庫定義1.2 數據庫與文件系統的區別1.3 數據庫系統組成部分1.4 關系型數據庫與非關系型數據庫二、數據庫安裝與配置2.1 下載 MySQL2.2 安裝 MySQL2.3 初始化數據庫服務器2.4 啟動和停止 MySQL 服務2.5 登錄 MySQL2.6 創建數據庫2.7 創建數據表三、…

【JAVA】消息隊列(MQ)是個好東西

一、前言再JAVA系統開發中,再高并發的場景經常需要使用到消息隊列,有時候是不得不使用到消息對了。特別是大數據量的并發處理。對數據實時性要求又沒那么高的情況下。用戶請求 → 接入層(Nginx) → 限流 → 消息隊列 → 訂單服務 → 庫存服務 → 支付服務…

【Golang面試題】Go結構體的特點,與其它語言的區別

Go 結構體深度解析:與 C/C、Java 的全面對比 一、核心概念對比特性Go 結構體 (struct)C/C 結構體 (struct)Java 類 (class)本質值類型復合數據類型值類型復合數據類型引用類型內存分配棧或堆 (編譯器決定)棧 (顯式控制)堆 (JVM管理)默認訪問權限首字母大寫導出publi…

CppCon 2018 學習:OOP is dead, long live Data-oriented design

探討了面向對象編程(OOP)的一些根本性問題深入理解: 標題:What is so wrong with OOP? 什么是面向對象的問題? 這不是說 OOP “絕對錯誤”,而是指出它在實踐中經常引發的問題,尤其是在性能敏…

科學的第五范式:人工智能如何重塑發現之疆

在人類探索未知的壯闊史詩中,科學方法的演進如同照亮迷霧的燈塔。從基于經驗的第一范式(描述自然現象),到以理論推演為核心的第二范式(牛頓定律、麥克斯韋方程),再到以計算機模擬為標志的第三范…

tmux 左下角會話名顯示不全的解決方法

在 tmux 中顯示完整的會話名 有時候我們要在服務器上長時間跑某個任務,但不可能時時刻刻保持終端模擬器開啟,這時候就需要用到 tmux ,可以在關閉會話的同時讓任務繼續在后臺跑,后續還可以連回來。但在 tmux 會話中,左…

【期末分布式】分布式的期末考試資料大題整理

🧸安清h:個人主頁 🎥個人專欄:【Spring篇】【計算機網絡】【Mybatis篇】 🎯大題 ?一.Nacos的服務注冊與發現 🚦1.怎么來進行服務的注冊與發現的這樣的一個流程,描述一下。 🎃描述…

Android手機無網離線使用FunASR識別麥克風語音內容

手機斷網離線使用FunASR識別麥克風語音內容 --本地AI電話機器人 上一篇:阿里FunASR本地斷網離線識別模型簡析 下一篇:手機無網離線使用FunASR識別手機歷史通話錄音 一、前言 繼上一篇《阿里FunASR本地斷網離線識別模型簡析》和前面幾篇ASR相關理論的…