絕對導入:從要導入文件的頂級包開始寫起
print(__package__) # 打印出該文件所在包的路徑
以下面所示項目文件結構爲例:
# 頂級包一般是項目文件夾中最上層的包,比如說a,b中的模塊的頂級包就分別是a,b
# a1中
print(__package__) >> a
# b1中
print(__package__) >> b
# bb1中
print(__package__) >> b.bb # 則 bb1 的頂級包就是b
# csdn中
print(__package__) >> None # 該模塊(.py文件)直接在項目文件夾下,無頂級包,所以一般都是將入口文件放在項目文件夾下,最外層一般不相互調用
# 絕對調用時
form b.bb import bb1 # 調用bb1
相對導入:
. # 當前包
.. # 上一級包
... # 上上一級
# 在b1中導入b2
form . import b2
# 在bb1中導入b1
from .. import b1
注意:
1. 入口文件(即運行開始的文件)不可使用相對導入
# 運行a2.py相對調用同級的a1.py
from . import a1
錯誤原因:入口文件在編譯時會被python自動命名成__main__,你是找不到 . 作爲本級文件夾的
2. 絕對導入一定要從頂級包開始
我一般都直接採用頂級調用(包內文件層級較少的情況,而且我喜歡在模塊中寫一個自己的驗證程序,所以相對調用老是報1.的錯)
包內文件不作入口文件使用的話,完全可以在包內調用寫相對調用,比較簡潔方便