一個相對路徑導入時的錯誤:
from..dir3importb2
ValueError:attemptedrelativeimportbeyondtop-levelpackage
dir3明明在dir1下,在路徑相對上,dir3確實是a1.py的../dir3,但執(zhí)行pythona1.py為什么會報錯?
from..dir3importb2
這是因為文件系統(tǒng)路徑并不真的代表包的相對路徑,當在dir1/a1.py中使用..dir3,python并不知道包dir1的存在,因為沒有將它導入,沒有聲明為模塊變量,同樣,也不知道dir2的存在,僅僅只是根據(jù)語句知道了dir3的存在。但因為使用了相對路徑,不會搜索sys.path,所以它的相對路徑邊界只在本文件。所以,下面的導入也是錯誤的:
from.importa2
實際上,更標準的解釋是,當py文件作為可執(zhí)行程序文件執(zhí)行時,它所在的模塊名為__main__,即__name__為__main__,但它并非一個包,而是一個模塊文件,對它來說沒有任何相對路徑可言。
解決方法是顯式導入它們的父包,讓python記錄它的存在,只有這樣才能使用..:
python-mdir1.dir2.a2
還有幾個常見的相對路徑導入錯誤:
from.a3importx
錯誤:
ModuleNotFoundError:Nomodulenamed'__main__.a3';'__main__'isnotapackage
原因是一樣的,py文件作為可執(zhí)行程序文件執(zhí)行時,它所在的模塊名為__main__,它并非一個包。
最后,建議在條件允許的情況下,使用絕對路徑導入,而不是相對路徑。
以上內(nèi)容為大家介紹了Python相對路徑導入陷阱,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。