077-模塊-06-模塊搜索順序_嗶哩嗶哩_bilibili
080-包-01-包的概念以及建立包的方式_嗶哩嗶哩_bilibili
088-文件操作-01-文件操作套路以及Python中的對應函數和方法_嗶哩嗶哩_bilibili
注:
1.import math和 from math import *區別
2.
模塊(Module)
- **本質**:以 `.py` 結尾的**單個文件**,包含Python代碼(函數、類、變量等)。
- **作用**:將代碼拆分到不同文件中,避免代碼冗余,方便復用和維護。
包(Package)
在python里,包就是庫
- **本質**:**有層次的文件目錄結構**(即文件夾),用于組織多個模塊和子包。
- **核心特征**:包的根目錄下必須包含一個 `__init__.py` 文件(可以為空),用于標識該目錄是一個包。
都可以通過import進行調用
3.學會查看庫、函數的官方文檔了解其用法、細節
python main.py就是讓運行main.py時,能讓里面的包、模塊成功導入
4.導入自定義庫 / 模塊的常見方式
Python 導入自定義模塊(如自己編寫的?.py
?文件或包),需根據模塊的位置關系和使用需求選擇語法,核心有以下 4 類:
(1)直接導入整個模塊
適合需要調用模塊內多個函數 / 類的場景,調用時需加「模塊名。對象名」前綴。
示例(假設?circle.py
?含?calculate_area
?和?calculate_circumference
?兩個函數):
# main.py
import circle # 導入整個 circle 模塊radius = 5
area = circle.calculate_area(radius) # 通過「模塊名.函數名」調用
circum = circle.calculate_circumference(radius)
print(area, circum)
(2)從模塊導入 “指定對象”
適合僅需模塊內部分函數 / 類的場景,調用時無需加模塊名前綴,更簡潔。
# main.py
from circle import calculate_area # 只導入 calculate_area 函數radius = 5
area = calculate_area(radius) # 直接調用函數,無需寫 circle.
print(area)
也可一次性導入多個對象(用逗號分隔):
from circle import calculate_area, calculate_circumference
(3)導入模塊并 “起別名”
用于簡化長模塊名或解決命名沖突(比如模塊名與變量 / 其他模塊重名)。
示例(模塊名過長時):
import my_very_long_module_name as mvlm # 給模塊起別名 mvlm
mvlm.some_function() # 等價于 my_very_long_module_name.some_function()
也可給導入的對象起別名
from circle import calculate_area as calc_area
area = calc_area(5)
(4)導入 “包” 中的模塊(包是含?__init__.py
?的文件夾)
復雜項目中,模塊常放在 “包”(帶?__init__.py
?的文件夾)里,需指定 “包路徑” 導入。
假設目錄結構:
project/
├── main.py
└── utils/├── __init__.py # 空文件,標記 utils 是“包”└── geometry.py # 含 calculate_area 函數
導入方式:
# 方式1:導入包內的模塊,再調用模塊內對象
from utils import geometry
area = geometry.calculate_area(5)# 方式2:直接導入包內模塊的對象
from utils.geometry import calculate_area
area = calculate_area(5)
5.導入庫 / 模塊的核心邏輯:Python 的 “模塊查找路徑”(與根目錄、解釋器 / 終端目錄的關系)
Python 導入模塊時,不是隨機搜索,而是嚴格按照「預定義的路徑列表」查找 —— 這個列表存于?sys.path
?中。理解?sys.path
,就能明白 “根目錄、解釋器目錄、終端目錄” 如何影響導入。
(1)sys.path
?是什么?
sys.path
?是一個列表,存儲著?Python 解釋器會搜索模塊的所有目錄路徑。執行?import xxx
?時,解釋器會依次遍歷?sys.path
?里的每個目錄,尋找名為?xxx.py
(或包?xxx/
)的模塊。
可通過代碼打印?sys.path
?查看路徑:
import sys
print(sys.path)
輸出大致包含以下幾類路徑(不同環境略有差異):
["終端運行腳本時的“當前目錄”", # 關鍵!終端所在目錄會被優先加入"Python 解釋器的內置庫目錄", # 如 .../python3.10/lib(存放 os、sys 等內置模塊)"第三方庫安裝目錄", # 如 .../site-packages(存放 pandas、numpy 等第三方庫)...
]
(2)“終端的目錄” 如何影響導入?
當你在終端中運行?python main.py
?時,Python 會自動把?“終端當前所在的目錄”?加入?sys.path
?的最前面。這就是為什么 “終端需要?cd
?到項目根目錄再運行腳本”—— 這樣項目根目錄下的自定義模塊(如?circle.py
)才能被找到。
舉個例子:
- 終端當前目錄是?
/home/user/project/
(項目根目錄,含?main.py
?和?circle.py
); - 運行?
python main.py
,Python 會把?/home/user/project/
?加入?sys.path
; - 當?
main.py
?執行?import circle
?時,解釋器會在?sys.path[0]
(即?/home/user/project/
)中找到?circle.py
,成功導入。
(3)“解釋器的目錄” 有什么用?
Python 解釋器的安裝目錄(如?/usr/local/bin/python3
?所在層級)中,包含?Python 內置庫(如?os.py
、sys.py
)和?標準庫(如?math.py
、datetime.py
)。這些目錄會被加入?sys.path
,因此你能直接?import math
—— 解釋器會自動去自身的庫目錄中查找。
(4)“項目根目錄” 的角色(IDE 中的根目錄設置)
IDE(如 VSCode、PyCharm)里的 “項目根目錄”,本質是模擬 “終端?cd
?到根目錄運行腳本” 的效果:
- IDE 運行腳本時,會自動把 “項目根目錄” 加入?
sys.path
; - 這樣,你在代碼中導入根目錄下的模塊(如?
from utils import xxx
),就和 “終端在根目錄運行” 的效果一致,避免因 “開發時路徑錯誤” 導致導入失敗。
(5)核心邏輯總結:導入 = “在?sys.path
?列表的目錄里,找對應模塊文件”
無論導入自定義模塊、第三方庫還是內置庫,Python 都遵循以下流程:
- 將需要的 “搜索目錄”(終端當前目錄、解釋器庫目錄、第三方庫目錄等)加入?
sys.path
; - 遍歷?
sys.path
?里的每個目錄,檢查是否存在要導入的模塊(.py
?文件或包文件夾); - 找到則導入,找不到則報?
ModuleNotFoundError
。
示例:“終端目錄不對導致導入失敗”
假設目錄結構:
project/
├── main.py
└── circle.py
main.py
?中含?import circle
。
- 情況 1:終端?
cd
?到?project/
,運行?python main.py
?→ 成功(project/
?在?sys.path
?中,能找到?circle.py
)。 - 情況 2:終端在?
project/
?的父目錄(如?/home/user/
),直接運行?python project/main.py
?→ 失敗(此時?sys.path
?的 “當前目錄” 是?/home/user/
,不含?circle.py
,會報?ModuleNotFoundError
)。