【python小白】 問關于導入嵌套的包的問題
問題描述
先看我的包的目錄結構:
最外層的包名字叫Msgnew,里面有init文件,有一個叫get的模塊還有一個叫Msg的子包,進入Msg的子包里面,可以看到也有init文件,并且里面有2個模塊,一個叫Sendmsg,一個叫Receivemsg模塊
我現在要導入子包里面的Sendmsg的模塊,并且使用其中一個函數順便介紹下Sendmsg模塊里面,其實就是三個函數,如圖:
導入過程的代碼如下:
# -*- coding:gb2312 -*-# 代碼1from Msgnew import MsgMsg.Sendmsg.test1()# 代碼2#from Msgnew.Msg import Sendmsg#Sendmsg.test1()
這里有代碼1和代碼2代碼1執行結果如下:
然后接下來把代碼1注釋掉,再執行代碼2,結果如下:
這里我就很不理解了,
難道紅色方框當中,這兩段代碼是不等價的?在我看來這兩個應該是一個意思啊,為什么一個是錯的,一個是對的?
問題解答
回答1:雖然他們都是子模塊,但是實際上他們的實現邏輯是不一樣的,這樣也就導致了,最終import進來的,必須是一個Python文件,而并非一個模塊目錄,所以代碼二中import Sendmsg部分才是真正的引入了這個Python文件,而前面的from Msgnew.Msg則是告訴解析器到哪個位置去找Sendmsg文件。
回答2:我知道我自己遇到的這個問題出在哪兒了。當導入的不是模塊,而是包的時候,如果想直接把里面的模塊一起導入,必須在包的init文件里面寫入:
__all__ = ['Sendmsg','Receivemsg']from . import Sendmsgfrom . import Receivemsg
如圖:
接下來再執行的時候,成功!
相關文章:
1. angular.js - webpack build后的angularjs路由跳轉問題2. java - web項目中,用戶登陸信息存儲在session中好 還是cookie中好,取決于什么?3. 數組按鍵值封裝!4. mysql - 根據一個字段查找另一個字段重復的數據?并刪除相同的記錄,保留其中一個。5. 為什么bindClass訪問不了的?6. 這個是什么問題?7. mysql - navicat 經常打開表一直在載入中 也不能關閉 著急解決8. 單擊登錄按鈕無反應9. mysql - 查詢字段做了索引為什么不起效,還有查詢一個月的時候數據都是全部出來的,如果分拆3次的話就沒問題,為什么呢。10. mysql儲存json錯誤
