【python小白】 問關(guān)于導(dǎo)入嵌套的包的問題
問題描述
先看我的包的目錄結(jié)構(gòu):
最外層的包名字叫Msgnew,里面有init文件,有一個叫g(shù)et的模塊還有一個叫Msg的子包,進入Msg的子包里面,可以看到也有init文件,并且里面有2個模塊,一個叫Sendmsg,一個叫Receivemsg模塊
我現(xiàn)在要導(dǎo)入子包里面的Sendmsg的模塊,并且使用其中一個函數(shù)順便介紹下Sendmsg模塊里面,其實就是三個函數(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)中,這兩段代碼是不等價的?在我看來這兩個應(yīng)該是一個意思啊,為什么一個是錯的,一個是對的?
問題解答
回答1:雖然他們都是子模塊,但是實際上他們的實現(xiàn)邏輯是不一樣的,這樣也就導(dǎo)致了,最終import進來的,必須是一個Python文件,而并非一個模塊目錄,所以代碼二中import Sendmsg部分才是真正的引入了這個Python文件,而前面的from Msgnew.Msg則是告訴解析器到哪個位置去找Sendmsg文件。
回答2:我知道我自己遇到的這個問題出在哪兒了。當(dāng)導(dǎo)入的不是模塊,而是包的時候,如果想直接把里面的模塊一起導(dǎo)入,必須在包的init文件里面寫入:
__all__ = ['Sendmsg','Receivemsg']from . import Sendmsgfrom . import Receivemsg
如圖:
接下來再執(zhí)行的時候,成功!
相關(guān)文章:
1. android - NavigationView 的側(cè)滑菜單中如何保存新增項(通過程序添加)2. tp5 不同控制器中的變量調(diào)用問題3. 微信小程序可以用gulp,webpack嗎?4. mysql服務(wù)無法啟動1067錯誤,誰知道正確的解決方法?5. ueditor上傳服務(wù)器提示后端配置項沒有正常加載,求助!!!!!6. python - 為什么正常輸出中文沒有亂碼,zip函數(shù)之后出現(xiàn)中文編程unicode編碼的問題,我是遍歷輸出的啊。7. 老師 我是一個沒有學(xué)過php語言的準(zhǔn)畢業(yè)生 我希望您能幫我一下8. 這段代碼既不提示錯誤也看不到結(jié)果,請老師明示錯在哪里,謝謝!9. php7.3.4中怎么開啟pdo驅(qū)動10. 提示語法錯誤語法錯誤: unexpected ’abstract’ (T_ABSTRACT)
