本文主要解釋Python語言中的兩個基本概念:
- 目前工作目錄(Current Working Directory, cwd)
- 子產品第一搜尋路徑
============================================
先說明下,本文是在Ubuntu22.04系統上操作的,Python語言為3.10版本。
-----------------------------------------
1. 目前工作目錄(Current Working Directory, cwd)
目前工作目錄(Current Working Directory, cwd),又叫資源搜尋目錄,顧名思義這個cwd目錄就是為了提供資源進行讀寫的,而在Python語言中這個cwd目錄的應用場景也是更為簡單,就是open函數中相對路徑的起始路徑。在Python語言中目前工作目錄也可以用相對路徑表示為 “.” 。
舉例:
代碼檔案夾格式如下:

xxx.py 檔案内容:
import os
print( os.getcwd() )
print( os.path.abspath('.') )
with open("yyy0/yyy1/yyy.py") as file:
print( file.read() )
os.chdir("yyy0/yyy1")
print( os.getcwd() )
print( os.path.abspath('.') )
with open("yyy.py") as file:
print( file.read() )
yyy.py 檔案内容:
print("Thist is yyy.py file.")
--------------------------------------
假設我們現在是在檔案夾12345中執行指令:
python3 xxx0/xxx1/xxx.py
此時的目前工作目錄CWD,也就是目前目錄“.”,為 /home/devil/12345 , 我們以此目錄為起始目錄使用相對路徑讀取 yyy.py 檔案内容,其相對路徑為:yyy0/yyy1/yyy.py
同時我們也可以以目前工作目錄(“.”)為起始點用相對路徑"yyy0/yyy1"來切換目前的工作目錄(“.”)為
--------------------------------------------------
如果我們改變啟動程式時所在的目錄則目前工作目錄cwd也是會改變的,如下面操作:
可以看到目前工作目錄預設是為啟動代碼時所在的目錄:
如果在目錄/home/devil/12345下執行代碼,執行指令為:python3 xxx0/xxx1/xxx.py ,則目前工作目錄為 /home/devil/12345 ;
如果在目錄/home/devil/12345/xxx0下執行代碼,執行指令為:python3 xxx1/xxx.py ,則目前工作目錄為 /home/devil/12345/xxx0 ;
同理,如果在目錄/home/devil/12345/xxx0/xxx1下執行代碼,執行指令為:python3 xxx.py ,則目前工作目錄為 /home/devil/12345/xxx0/xxx1 。
-------------------------------------------
由上我們可以看到目前工作目錄cwd,也就是目前目錄“.”是資源搜尋目錄,或者說是資源搜尋時相對路徑的起始路徑;同時我們也可知道目前工作目錄,cwd目錄是可以進行操作改變的,改變後使用相對路徑讀取其他檔案時其起始點也是進行變更的。
====================================================
上面說的就是目前工作目錄cwd,即目前目錄“.”的含義及使用方法,下來我們看下子產品搜尋路徑又是什麼。
2. 子產品搜尋路徑
有人又将其叫做import路徑或 導入路徑
,說的直白些就是那些可以通過import語句引入子產品的路徑。
導入路徑
子產品第一搜尋路徑,也就是預設你代碼所在項目的頂層目錄,也就是你項目代碼中所有import本項目中代碼的起始路徑,在Python中除了你本項目的頂層目錄可以import同時Python語言自帶庫路徑也是可以import的。
由 檢視并添加python中庫的搜尋路徑 ,可知Ubuntu下檢視Python語言自帶的庫路徑(import 路徑):
指令:
python3 -m site
可以看到上面顯示的一個路徑以外的其他路徑均為Python語言自帶的系統庫的路徑,這些自帶庫路徑下存放的都是Python語言自帶的庫函數和通過pip install等方式安裝的庫,而我們這裡所要講的的路徑就是這裡的非自帶庫路徑,即子產品第一搜尋路徑。
在Python中我們可以使用 sys.path 語句檢視目前的子產品搜尋路徑。
顧名思義,子產品第一搜尋路徑就是指import時首先尋找庫子產品的路徑,如果是通過互動方式啟動Python則該路徑為啟動指令時所在的路徑,這裡我們所要讨論的是非互動方式啟動Python程式時。
以非互動方式啟動Python代碼,則子產品第一搜尋路徑為啟動檔案所在的路徑,也可以視作該路徑為你的項目代碼的頂層目錄,我們修改上面的xxx.py檔案,内容如下(檔案夾下檔案樹結構不變):
import os
import sys
print( os.getcwd() )
print( os.path.abspath('.') )
print(sys.path)
with open("yyy0/yyy1/yyy.py") as file:
print( file.read() )
os.chdir("yyy0/yyy1")
print( os.getcwd() )
print( os.path.abspath('.') )
print(sys.path)
with open("yyy.py") as file:
print( file.read() )
使用 python3 xxx0/xxx1/xxx.py 指令啟動,效果如下:
使用 python3 xxx1/xxx.py 指令啟動,效果如下:
可以看到不論采用何種方式啟動檔案xxx.py,子產品第一搜尋路徑均為xxx.py所在路徑。由此可知,子產品第一搜尋路徑是不會随着目前工作指令cwd的改變而改變的,且不論使用那種啟動方式(子產品啟動方式除外,python -m ),子產品第一搜尋路徑均為啟動檔案所在目錄路徑,該路徑則為該程式運作時的頂層目錄,也就是import本項目中子產品的起始import路徑。
===========================================
既然在python項目中預設的子產品第一搜尋路徑為啟動檔案所在目錄路徑,那麼我們是否可以對其進行修改呢,或者添加新的子產品搜尋路徑呢,具體的參看下文:
如何更改Python項目中的 子產品搜尋第一路徑
-------------------------------------------------------------------
另外說一點,在python的互動方式中由于第一子產品搜尋路徑并不是使用絕對位址而是相對位址,而相對位址的根目錄為目前工作目錄,而目前工作目錄是可以手動修改的,是以第一搜尋子產品也會随之更改的。