【python小白】 問關(guān)于導(dǎo)入嵌套的包的問題
問題描述
先看我的包的目錄結(jié)構(gòu):
最外層的包名字叫Msgnew,里面有init文件,有一個(gè)叫g(shù)et的模塊還有一個(gè)叫Msg的子包,進(jìn)入Msg的子包里面,可以看到也有init文件,并且里面有2個(gè)模塊,一個(gè)叫Sendmsg,一個(gè)叫Receivemsg模塊
我現(xiàn)在要導(dǎo)入子包里面的Sendmsg的模塊,并且使用其中一個(gè)函數(shù)順便介紹下Sendmsg模塊里面,其實(shí)就是三個(gè)函數(shù),如圖:
導(dǎo)入過程的代碼如下:
# -*- coding:gb2312 -*-# 代碼1from Msgnew import MsgMsg.Sendmsg.test1()# 代碼2#from Msgnew.Msg import Sendmsg#Sendmsg.test1()
這里有代碼1和代碼2代碼1執(zhí)行結(jié)果如下:
然后接下來把代碼1注釋掉,再執(zhí)行代碼2,結(jié)果如下:
這里我就很不理解了,
難道紅色方框當(dāng)中,這兩段代碼是不等價(jià)的?在我看來這兩個(gè)應(yīng)該是一個(gè)意思啊,為什么一個(gè)是錯(cuò)的,一個(gè)是對(duì)的?
問題解答
回答1:雖然他們都是子模塊,但是實(shí)際上他們的實(shí)現(xiàn)邏輯是不一樣的,這樣也就導(dǎo)致了,最終import進(jìn)來的,必須是一個(gè)Python文件,而并非一個(gè)模塊目錄,所以代碼二中import Sendmsg部分才是真正的引入了這個(gè)Python文件,而前面的from Msgnew.Msg則是告訴解析器到哪個(gè)位置去找Sendmsg文件。
回答2:我知道我自己遇到的這個(gè)問題出在哪兒了。當(dāng)導(dǎo)入的不是模塊,而是包的時(shí)候,如果想直接把里面的模塊一起導(dǎo)入,必須在包的init文件里面寫入:
__all__ = ['Sendmsg','Receivemsg']from . import Sendmsgfrom . import Receivemsg
如圖:
接下來再執(zhí)行的時(shí)候,成功!
相關(guān)文章:
1. 網(wǎng)頁爬蟲 - Python小白用Scrapy爬蟲返回的是空元素,請(qǐng)問各位大神哪里出了問題?2. 在windows下安裝docker Toolbox 啟動(dòng)Docker Quickstart Terminal 失敗!3. dockerfile - [docker build image失敗- npm install]4. debian - docker依賴的aufs-tools源碼哪里可以找到啊?5. 關(guān)docker hub上有些鏡像的tag被標(biāo)記““This image has vulnerabilities””6. python3.x - 如何在云服務(wù)器上運(yùn)行python腳本?7. mysql - 如何在數(shù)據(jù)庫里優(yōu)化 漢明距離 查詢?8. javascript - QQ第三方登錄的問題9. MySQL部署單機(jī)多實(shí)例無法初始化數(shù)據(jù)庫10. python flask做的文件系統(tǒng)上傳系統(tǒng),路徑?jīng)]錯(cuò),文件列表加載不出來,error 10053
