Python相對導(dǎo)入報錯怎么解決

本篇內(nèi)容主要講解“Python相對導(dǎo)入報錯怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python相對導(dǎo)入報錯怎么解決”吧!

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了丹陽免費建站歡迎大家使用!

相對導(dǎo)入

相對導(dǎo)入是指在同一個項目下不同模塊之間相互導(dǎo)入,稱為相對導(dǎo)入。

相對導(dǎo)入的案例

項目結(jié)構(gòu)圖如下:

Python相對導(dǎo)入報錯怎么解決

項目名稱project,該目錄下有xx子項目和test.py模塊。其中xx子目錄下有y和z兩個子目錄,y子目錄下有abc.py模塊和yy.py模塊,z子目錄下有zz.py模塊。yy.py是xx子項目的入口。test.py是整個項目的入口。

test.py模塊的內(nèi)容

"""
此模塊是整個project項目的入口
"""

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子項目對外引用的入口
"""

from .abc import *
from ..z.zz import *

num3 = 888


def f2():
    print(num2)
    print(num1)

zz.py模塊的內(nèi)容

"""
子項目,被導(dǎo)入的子模塊
"""

num1 = 10


def f():
    print('hello')

abc.py模塊的內(nèi)容

"""
子項目,被導(dǎo)入的子模塊
"""

num2 = 123

以上就是模擬大型項目的框架結(jié)構(gòu),測試運行test.py模塊可以看到輸出正常,完全沒有問題。

請仔細(xì)看yy.py模塊的內(nèi)容:

from .abc import *語句:. 表示當(dāng)前目錄,abc表示abc.py模塊。

from ..z.zz import *語句,.. 表示父目錄,z表示z文件夾,zz表示zz.py模塊。

另外... 表示祖父目錄,請熟悉from 路徑標(biāo)識結(jié)構(gòu)。

相對導(dǎo)入:以from . 開頭的語句,例如from .abc import *。

絕對導(dǎo)入:以文件夾或包或模塊名開頭的語句,例如from xx.y import yy。

以上暫未遇到報錯,可如果你嘗試調(diào)試yy.py模塊,直接運行yy.py模塊時會報錯。

Python相對導(dǎo)入報錯怎么解決

相對導(dǎo)入報錯情況分析

是不是非常奇怪!為什么運行test.py模塊調(diào)用yy.py模塊時不報錯,而直接腳本方式運行yy.py模塊時會報錯。我在網(wǎng)上找了很多資料沒理出個頭緒。后來找到有建議在yy.py模塊中對sys.path添加路徑,方法雖然可行但不優(yōu)雅,也沒有解釋為什么yy.py模塊被調(diào)用時不會報錯,而直接運行yy.py會報錯。

我針對被調(diào)用時不報錯主動執(zhí)行時報錯的情況特地查了很多資料,做了仔細(xì)分析,關(guān)于上述這個特點我首先想到的是__name__,這個變量在被調(diào)用時和主動執(zhí)行時內(nèi)容是不一樣的。后來針對模塊調(diào)用查資料找到了__package__,這個變量在被調(diào)用時和主動執(zhí)行時內(nèi)容也是不一樣的。

下面我們嘗試打印__name__和__package__這兩個變量,看看在被調(diào)用和主動執(zhí)行時分別有什么不同。

修改yy.py模塊文件內(nèi)容

"""
此模塊是xx子項目對外引用的入口
"""

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é)果(暫時注釋那2行相對導(dǎo)入的代碼,要不然報錯會導(dǎo)致看不到print打印內(nèi)容):

Python相對導(dǎo)入報錯怎么解決

相對導(dǎo)入報錯的pythonic解決方法

認(rèn)真觀察yy.py模塊被導(dǎo)入時打印的內(nèi)容和主動執(zhí)行時打印的內(nèi)容不同之處。我想到了最pythonic的解決方案。

"""
此模塊是xx子項目對外引用的入口
"""
__package__ = 'xx.y'

from .abc import *
from ..z.zz import *


num3 = 888


def f2():
    print(num2)
    print(num1)

直接修改__package__變量的值為被調(diào)用時的值,這樣主動運行yy.py模塊時不再報錯,被調(diào)用時也不報錯。

到此,相信大家對“Python相對導(dǎo)入報錯怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

本文標(biāo)題:Python相對導(dǎo)入報錯怎么解決
分享網(wǎng)址:http://muchs.cn/article6/jpihog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、企業(yè)建站、域名注冊標(biāo)簽優(yōu)化、小程序開發(fā)網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)