python深入之包內的模組匯入

2021-08-22 13:30:26 字數 1498 閱讀 6934

關於包內匯入的概念和分類

(1)包內匯入:即在乙個包的內部,存在某個模組匯入了其他在該包內部的模組

(2)包內匯入分類:絕對匯入和相對匯入。絕對匯入即是使用絕對路徑進行匯入,如import 包.模組;相對匯入即是使用「.」 或「..」來表示相對路徑進行匯入,「.」表示根據模組名稱獲取的當前目錄,「..」表示根據模組名稱獲取的上級目錄,如from . import a

關於兩種形式解決的包內匯入所產生的問題

(1)絕對匯入解決模組的巢狀匯入問題:

問題陳述:假設有乙個包p,乙個外部模組test,包內有兩個個模組p1和p2,需求是在模組test中匯入p1,再在p1中匯入p2

錯誤方案:首先,在p1中匯入p2,import p2,由於p1和p2位於同乙個包中,不會報錯;然後在test中匯入p1,import p.p1,這時就會出問題,報錯說沒有乙個模組名稱為p2

原因:模組的匯入路徑位於sys.path路徑列表,當使用直譯器執行乙個檔案時,就會確定當前檔案所在的目錄,並將該目錄放入sys.path中的當前目錄位置,新增過之後,隨著test檔案執行的後續模組匯入也會遵循這個sys.path路徑列表。這裡首先執行test檔案,sys.path中的當前目錄就變成了test檔案所在的目錄,這時,執行p1檔案,匯入p2模組時,就會到sys.path中的當前目錄即test檔案所在的目錄中尋找p2,但test是包外模組,在它所在的目錄下不可能找到p包內的模組,所以這裡就會報錯

正確方案:在p1中匯入p2時使用絕對路徑匯入,即import p.p2或者from p import p2,由於p包與test檔案在同乙個目錄下,所以在sys.path中的當前目錄中可以找到包p,然後從p中再來找到p2

(2)相對匯入解決包名修改導致的內部使用絕對路徑匯入模組的方式跟著修改的問題

問題陳述:在上述正確方案中存在乙個問題,即如果包內匯入涉及很多模組的匯入,使用絕對路徑匯入的話,每一次匯入都要寫包名p,一旦包的名稱被改掉了,這些匯入語句就都要跟著修改,工作量很大

解決方案:使用相對路徑進行匯入,形式為from . import p2,即根據模組名稱獲取當前目錄。

重點描述:當乙個模組直接以指令碼的形式進行執行時,其名稱為__main__,如是以模組的形式進行載入的(被匯入),那麼其名稱是由載入的路徑決定的,如包名.包名.模組名。所以上述的當前目錄和上級目錄不能單純的認為是模組檔案所在的當前目錄和上級目錄,這裡是根據模組名稱獲取的,如p2是被p1匯入的,那麼執行p1,這時p2的模組名稱是其路徑,即p.p2,那麼「.」代表的當前目錄就是p,而使用「..」時就會報錯,因為p已經是p2的最上級,沒有其他,而不是在系統目錄中的更上一級

關於隱式相對路徑和總結

(1)在python3之前的版本中,使用的都是隱式的相對路徑,即模組的巢狀匯入問題在python3之前的版本中不存在,其中的import p2就相當於from . import p2

(2)解決方案是在模組最前面加入from __future__ import absolute_import語句,就可以消除隱式相對匯入形式

(3)總結:在包外進行匯入時,用絕對匯入方式,在包內進行匯入時,用相對匯入方式

python導模組和包

1 python中的模組 python模組,是乙個python檔案,以.py結尾,包含了python物件的定義和python語句。2 python中的包 包就是資料夾,但該資料夾下必須存在init.py 檔案,該檔案的內容可以為空。直接匯入模組 import time 直接匯入包 import se...

python深入之包和模組,包和模組的匯入方式

關於包和模組 2 包 是乙個有層級的目錄結構,包含n個模組或者n個子包,包中一定要有 init py檔案 3 庫 是完成一定功能的 集合,表現形式是乙個模組,或包 4 框架 是乙個架構層面的概念,為解決乙個開放性問題而設計的具有一定約束性的支撐結構,通過框架可以快速實現乙個解決問題的骨架,後面按照框...

Python基礎 函式 模組 導包

1.預設引數 呼叫時不需要傳參,更加方便 def get sum start 1,end 100 pass2.可變數量引數 數量可變 引數名稱 裝包,型別是元組 def test a,b,args,c 0 print a,b,args,c test 1,2,3,4,5,c 100 1 2 3,4,5...