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