【python小白】 問關於導入巢狀的包的問題
phpcn_u1582
phpcn_u1582 2017-06-30 09:54:57
0
2
789

先看我的套件的目錄結構:

##最外層的包名字叫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,結果如下:

#這裡我就很不懂了,


難道紅色方框當中,這兩段程式碼是不等價的?
在我看來這兩個應該是一個意思啊,為什麼一個是錯的,一個是對的?

phpcn_u1582
phpcn_u1582

全部回覆(2)
大家讲道理

雖然他們都是子模組,但是實際上他們的實現邏輯是不一樣的,這樣也就導致了,最終import進來的,必須是一個Python文件,而並非一個模組目錄,所以代碼二中 import Sendmsg部分才是真正的引入了這個Python文件,而前面的from Msgnew.Msg則是告訴解析器到哪個位置去找Sendmsg文件。

某草草

我知道我自己遇到的這個問題出在哪裡了。
當導入的不是模組,而是包的時候,如果想直接把裡面的模組一起導入,必須在包的init檔裡面寫入:

__all__ = ["Sendmsg","Receivemsg"]

from . import Sendmsg
from . import Receivemsg

如圖:

接下來再執行的時候,成功!

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板