知識點回顧:
- 導入官方庫的三種手段
- 導入自定義庫/模塊的方式
- 導入庫/模塊的核心邏輯:找到根目錄(python解釋器的目錄和終端的目錄不一致)
作業:自己新建幾個不同路徑文件嘗試下如何導入
具體操作步驟:
-
在桌面上新建一個文件夾?
project
(這就是項目的根目錄)。 -
在?
project
?文件夾內新建?main.py
(主程序入口)。 -
在?
project
?內新建?lib
?文件夾,并在?lib
?內新建?utils.py
。 -
在?
project
?內新建?subpackage
?文件夾:-
在?
subpackage
?內新建?module1.py
。 -
在?
subpackage
?內新建?subsub
?文件夾,并在?subsub
?內新建?module2.py
。
-
-
關鍵步驟:在每個文件夾(
subpackage
?和?subsub
)內新建一個空文件?__init__.py
,告訴Python這是“包”(類似一個標志牌)。
2. 編寫模塊內容
(1) lib/utils.py
# 這是一個工具函數
def greet():print("Hello from utils")
(2) subpackage/module1.py
# 導入系統模塊(Python自帶的庫)
import sys
import os# 動態添加項目根目錄到Python的搜索路徑
root_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
sys.path.append(root_path)# 絕對導入:從項目根目錄下的lib文件夾導入utils模塊中的greet函數
from lib.utils import greetdef func1():greet()print("This is module1")# 相對導入:從當前包(subpackage)的subsub子包中導入module2的func2函數
from .subsub.module2 import func2
(3) subpackage/subsub/module2.py
import sys
import os# 動態添加項目根目錄到Python的搜索路徑
root_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
sys.path.append(root_path)# 絕對導入:從項目根目錄下的lib文件夾導入utils模塊中的greet函數
from lib.utils import greetdef func2():greet()print("This is module2")# 相對導入:從上級包(subpackage)導入module1模塊
from .. import module1
(4) main.py
import sys
import os# 確保項目根目錄在Python的搜索路徑中
root_path = os.path.dirname(os.path.abspath(__file__))
sys.path.append(root_path)# 從subpackage包中的module1模塊導入func1和func2
from subpackage.module1 import func1, func2if __name__ == "__main__":func1() # 調用func1func2() # 調用func2
3. 運行測試
運行方式一:在項目根目錄執行
-
打開終端(或命令行),進入?
project
?文件夾:cd /Users/yourname/Desktop/project
-
運行主程序:
python main.py
-
預期輸出:
Hello from utils This is module1 Hello from utils This is module2
運行方式二:在項目上級目錄執行
-
在終端中進入項目上級目錄(比如桌面):
cd /Users/yourname/Desktop
-
運行主程序:
python project/main.py
-
同樣會成功!因為代碼中動態添加了根目錄路徑。