模塊導入
在 Python 中,一個 模塊 就是一個包含了 Python 代碼的 .py 文件。導入模塊的目的是引入該文件內定義的函數、類或變量等
💎方式一:導入整個模塊 ( import module_name )
這是最常見和推薦的方式,因為它能保持清晰的命名空間,避免衝突
| 語句 | 作用 | 訪問方式 |
|---|---|---|
import math |
將整個 math 模塊對象引入 |
必須通過模塊名訪問:math.pi |
import pandas as pd |
使用別名 as 導入 |
使用別名訪問:pd.DataFrame |
🔫方式二:導入特定名稱 ( from module import name )
如果你只需要模塊中的少數幾個對象,可以直接將它們引入到當前命名空間
| 語句 | 作用 | 訪問方式 |
|---|---|---|
from math import pi |
將 pi 直接引入當前作用域 |
直接使用名稱:print(pi) |
from math import pi, sqrt |
將 pi 和 sqrt 直接引入當前作用域 |
直接使用名稱:print(pi, sqrt) |
from math import pi as p |
使用別名 p 導入 |
使用別名訪問:print(p) |
from math import pi as p, sqrt as sq |
使用別名 p 和 sq 導入 |
使用別名訪問:print(p, sq) |
💊方式三:星號導入 ( from module import )
星號導入會將模塊中所有公有名稱(不以下劃線 _ 開頭的名稱)全部引入到當前命名空間
| 語句 | 作用 | 訪問方式 |
|---|---|---|
from os import * |
導入 os 模塊中所有公有名稱 |
強烈不推薦,極易導致命名衝突,使代碼難以閲讀和維護 |
包導入
一個包就是一個包含多個模塊和子包的目錄(文件夾),用於提供結構化的命名空間。導入包涉及絕對導入和相對導入
🔑方式一:絕對導入 ( Absolute Imports )
這是在項目中跨包或訪問頂級模塊的標準方式。導入路徑從項目的根包名開始
假設項目結構:
project/packageA/module1.py 📌
project/packageB/module2.py
project/packageB/module3.py
| 語句 | 作用 | 訪問方式 |
|---|---|---|
from packageB import module2 |
在 module1 中訪問 module2 |
module2.func_name |
from packageB import module2, module3 |
在 module1 中訪問 module2 和 module3 |
module2.func_name
module3.func_name |
from packageB import module2 as m2 |
使用別名 m2 導入 |
m2.func_name |
from packageB import module2 as m2, module3 as m3 |
使用別名 m2 和 m3 導入 |
m2.func_name
m3.func_name |
from packageB.module2 import func_name |
在 module1 中訪問 module2內的函數 |
print(func_name) |
from packageB.module2 import func_name as fn |
使用別名 fn 導入 |
print(fn) |
from packageB.module2 import func_name, func_name2 |
在 module1 中訪問 module2內的函數 |
print(func_name)
print(func_name2) |
from packageB.module2 import func_name as fn, func_name2 as fn2 |
使用別名 fn 和 fn2 導入 |
print(fn)
print(fn2) |
🔑方式一:相對導入 ( Relative Imports )
相對導入只用於同一包內部的模塊互相引用,它使用點號 ( . ) 來表示相對位置。
假設項目結構:
project/pp/packageA/module1.py 📌
project/pp/packageA/module2.py
project/pp/packageA/module3.py
project/pp/module4.py
project/pp/module5.py
| 語句 | 作用 | 訪問方式 |
|---|---|---|
from . import module2 |
在 module1 中訪問 module2 |
module2.func_name |
from . import module2, module3 |
在 module1 中訪問 module2 和 module3 |
module2.func_name
module3.func_name |
from . import module2 as m2 |
使用別名 m2 導入 |
m2.func_name |
from . import module2 as m2, module3 as m3 |
使用別名 m2 和 m3 導入 |
m2.func_name
m3.func_name |
from .. import module4 |
在 module1 中訪問 module4 |
module4.func_name |
from .. import module4, module5 |
在 module1 中訪問 module4 和 module5 |
module4.func_name
module5.func_name |
from .. import module4 as m4 |
使用別名 m4 導入 |
m4.func_name |
from .. import module4 as m4, module5 as m5 |
使用別名 m5 和 m5 導入 |
m4.func_name
m5.func_name |
🎈方式三:導入包
當你導入一個包名時(如 import packageA),Python 解釋器會執行該包目錄下的 __init__.py 文件
- 初始化:
__init__.py文件中的所有頂級代碼都會被執行一次,用於初始化包的狀態 - 對外接口: 可以在
__init__.py中定義from .module import function,將包內部的常用功能提升到包的頂級命名空間,方便用户使用
導入查找順序
當 Python 遇到 import 語句時,它會按照以下順序查找模塊或包
- 檢查
sys.modules緩存(如果已導入則直接使用) - 檢查內置模塊
- 查找
sys.path列表中的目錄(包括當前目錄、PYTHONPATH環境變量和標準庫目錄)
其它&注意
Python中不可以直接導入模塊中的函數、類或變量,例如:import packageA.module1.func_name- 項目入口模塊一般放在項目最外層,可以自動將當前位置加入
sys.path,如果入口模塊放在packageA內,那其它項目其它包會找不到,除非手動調整sys.path - 模塊測試代碼一般放在
if __name__ == "__main__":語句下