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