先看我的套件的目錄結構:
##最外層的包名字叫Msgnew,裡面有init文件,有一個叫get的模組還有一個叫Msg的子包,進入Msg的子包裡面,可以看到也有init文件,並且裡面有2個模組,一個叫Sendmsg,一個叫Receivemsg模組
我現在要導入子包裡面的Sendmsg的模組,並且使用其中一個函數
順便介紹下Sendmsg模組裡面,其實就是三個函數,如圖:
#導入過程的程式碼如下:
# -*- coding:gb2312 -*-
# 代码1
from Msgnew import Msg
Msg.Sendmsg.test1()
# 代码2
#from Msgnew.Msg import Sendmsg
#Sendmsg.test1()
這裡有程式碼1和程式碼2
程式碼1執行結果如下:
#接著接下來把程式碼1註解掉,再執行程式碼2,結果如下:
#這裡我就很不懂了,
難道紅色方框當中,這兩段程式碼是不等價的?
在我看來這兩個應該是一個意思啊,為什麼一個是錯的,一個是對的?
雖然他們都是子模組,但是實際上他們的實現邏輯是不一樣的,這樣也就導致了,最終import進來的,必須是一個
Python
文件,而並非一個模組目錄,所以代碼二中import Sendmsg
部分才是真正的引入了這個Python文件,而前面的from Msgnew.Msg
則是告訴解析器到哪個位置去找Sendmsg文件。我知道我自己遇到的這個問題出在哪裡了。
當導入的不是模組,而是包的時候,如果想直接把裡面的模組一起導入,必須在包的init檔裡面寫入:
如圖:
接下來再執行的時候,成功!