本篇內(nèi)容主要講解“Python相對(duì)導(dǎo)入報(bào)錯(cuò)怎么解決”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python相對(duì)導(dǎo)入報(bào)錯(cuò)怎么解決”吧!
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了丹陽(yáng)免費(fèi)建站歡迎大家使用!
相對(duì)導(dǎo)入是指在同一個(gè)項(xiàng)目下不同模塊之間相互導(dǎo)入,稱為相對(duì)導(dǎo)入。
項(xiàng)目結(jié)構(gòu)圖如下:
項(xiàng)目名稱project,該目錄下有xx子項(xiàng)目和test.py模塊。其中xx子目錄下有y和z兩個(gè)子目錄,y子目錄下有abc.py模塊和yy.py模塊,z子目錄下有zz.py模塊。yy.py是xx子項(xiàng)目的入口。test.py是整個(gè)項(xiàng)目的入口。
test.py模塊的內(nèi)容
""" 此模塊是整個(gè)project項(xiàng)目的入口 """ from xx.y import yy yy.f2() print(yy.num1, yy.num2, yy.num3) out: 123 10 hello 10 123 888
yy.py模塊的內(nèi)容
""" 此模塊是xx子項(xiàng)目對(duì)外引用的入口 """ from .abc import * from ..z.zz import * num3 = 888 def f2(): print(num2) print(num1)
zz.py模塊的內(nèi)容
""" 子項(xiàng)目,被導(dǎo)入的子模塊 """ num1 = 10 def f(): print('hello')
abc.py模塊的內(nèi)容
""" 子項(xiàng)目,被導(dǎo)入的子模塊 """ num2 = 123
以上就是模擬大型項(xiàng)目的框架結(jié)構(gòu),測(cè)試運(yùn)行test.py模塊可以看到輸出正常,完全沒有問(wèn)題。
請(qǐng)仔細(xì)看yy.py模塊的內(nèi)容:
from .abc import *語(yǔ)句:. 表示當(dāng)前目錄,abc表示abc.py模塊。
from ..z.zz import *語(yǔ)句,.. 表示父目錄,z表示z文件夾,zz表示zz.py模塊。
另外... 表示祖父目錄,請(qǐng)熟悉from 路徑標(biāo)識(shí)結(jié)構(gòu)。
相對(duì)導(dǎo)入:以from . 開頭的語(yǔ)句,例如from .abc import *。
絕對(duì)導(dǎo)入:以文件夾或包或模塊名開頭的語(yǔ)句,例如from xx.y import yy。
以上暫未遇到報(bào)錯(cuò),可如果你嘗試調(diào)試yy.py模塊,直接運(yùn)行yy.py模塊時(shí)會(huì)報(bào)錯(cuò)。
是不是非常奇怪!為什么運(yùn)行test.py模塊調(diào)用yy.py模塊時(shí)不報(bào)錯(cuò),而直接腳本方式運(yùn)行yy.py模塊時(shí)會(huì)報(bào)錯(cuò)。我在網(wǎng)上找了很多資料沒理出個(gè)頭緒。后來(lái)找到有建議在yy.py模塊中對(duì)sys.path添加路徑,方法雖然可行但不優(yōu)雅,也沒有解釋為什么yy.py模塊被調(diào)用時(shí)不會(huì)報(bào)錯(cuò),而直接運(yùn)行yy.py會(huì)報(bào)錯(cuò)。
我針對(duì)被調(diào)用時(shí)不報(bào)錯(cuò)主動(dòng)執(zhí)行時(shí)報(bào)錯(cuò)的情況特地查了很多資料,做了仔細(xì)分析,關(guān)于上述這個(gè)特點(diǎn)我首先想到的是__name__,這個(gè)變量在被調(diào)用時(shí)和主動(dòng)執(zhí)行時(shí)內(nèi)容是不一樣的。后來(lái)針對(duì)模塊調(diào)用查資料找到了__package__,這個(gè)變量在被調(diào)用時(shí)和主動(dòng)執(zhí)行時(shí)內(nèi)容也是不一樣的。
下面我們嘗試打印__name__和__package__這兩個(gè)變量,看看在被調(diào)用和主動(dòng)執(zhí)行時(shí)分別有什么不同。
修改yy.py模塊文件內(nèi)容
""" 此模塊是xx子項(xiàng)目對(duì)外引用的入口 """ from .abc import * from ..z.zz import * print(__name__) print(__package__) num3 = 888 def f2(): print(num2) print(num1)
執(zhí)行test.py模塊的結(jié)果:
xx.y.yy xx.y 123 10 hello 10 123 888
直接執(zhí)行yy.py的結(jié)果(暫時(shí)注釋那2行相對(duì)導(dǎo)入的代碼,要不然報(bào)錯(cuò)會(huì)導(dǎo)致看不到print打印內(nèi)容):
認(rèn)真觀察yy.py模塊被導(dǎo)入時(shí)打印的內(nèi)容和主動(dòng)執(zhí)行時(shí)打印的內(nèi)容不同之處。我想到了最pythonic的解決方案。
""" 此模塊是xx子項(xiàng)目對(duì)外引用的入口 """ __package__ = 'xx.y' from .abc import * from ..z.zz import * num3 = 888 def f2(): print(num2) print(num1)
直接修改__package__變量的值為被調(diào)用時(shí)的值,這樣主動(dòng)運(yùn)行yy.py模塊時(shí)不再報(bào)錯(cuò),被調(diào)用時(shí)也不報(bào)錯(cuò)。
到此,相信大家對(duì)“Python相對(duì)導(dǎo)入報(bào)錯(cuò)怎么解決”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!