在某次運(yùn)行過程中出現(xiàn)了如下兩個報(bào)錯: 報(bào)錯1: 于是基于這兩個報(bào)錯探究了一下python3中的模塊相互引用的問題,下面來逐個解析,請耐心看完。 好的,我們先來構(gòu)造第一個錯: 測試代碼結(jié)構(gòu)如下:
此時運(yùn)行 問題原因: 主要在于引用src_test2模塊的時候,用的是相對路徑".",在import語法中翻譯成"./",也就是當(dāng)前目錄下,按這樣理解也沒有問題,那為什么報(bào)錯呢? 從 PEP 328 中,我們找到了關(guān)于 the relative imports(相對引用)的介紹 通俗一點(diǎn)意思就是,你程序入口運(yùn)行的那個模塊,就默認(rèn)為主模塊,他的name就是'main’,然后會將本模塊import中的點(diǎn)(.)替換成 解決方法: 因此,建議的做法是在 src同層級目錄創(chuàng)建 引用模塊
執(zhí)行報(bào)錯: 問題原因: 當(dāng)執(zhí)行test_src時,按上文理解,此時執(zhí)行文件所在的目錄為根目錄,那么引用test1的時候,需要注意的是,此時test1的name屬性不再是src.src_test1,因?yàn)槌绦蚋兄坏絪rc的存在,此時他的絕對路徑是 src_test1,此時再次引用相對路徑查找的test2,同樣的步驟,需要先找到父節(jié)點(diǎn),而此時他自己就是根節(jié)點(diǎn)了,已經(jīng)沒有父節(jié)點(diǎn)了,因此報(bào)錯“no known parent package”。 解決方法: 此時為了避免父節(jié)點(diǎn)產(chǎn)生矛盾,因此將test1中的引入去掉相對引用即可
繼續(xù)深入: 那使用相對路徑和絕對路徑,編譯器是怎么找到這個模塊的呢? 執(zhí)行import的時候,存在一個引入的順序,即優(yōu)先查找執(zhí)行目錄下有沒有此文件,如沒有,再查找lib庫下,如還沒有,再查找sys.path中的路徑,如再沒有,報(bào)錯。 所以不管是當(dāng)前目錄,還是 sys.path中的目錄,都可以查到 src_test2這個模塊,就可以編譯成功。 號外: 解決完上述問題后,不管我們用哪種方式,我們調(diào)試代碼時,都是單個文件調(diào)試,但此時根目錄就不對了,import方式又要改動,執(zhí)行起來很麻煩,所以這里推薦另一種方式(有更好的方式歡迎留言),使用
使用append的方式,將程序文件根目錄放進(jìn)了sys.path中,然后再引用絕對路徑,這樣的方式,不管使用上文中的第一或第二執(zhí)行方式都可以調(diào)用,也可以單獨(dú)編譯test1文件,不用修改import路徑,也是相對安全的方式。但是缺點(diǎn)就是,如果你修改了某一個包名,需要將所有引用地方都修改一下,工作量大,所以因地制宜。 綜上,詳細(xì)講解了相對路徑和絕對路徑的引用方法,現(xiàn)在你應(yīng)該對import導(dǎo)入的問題有了清晰的理解吧 |
|