搜尋

首頁  >  問答  >  主體

【python小白】 問關於導入巢狀的包的問題

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

##最外層的包名字叫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_u1582phpcn_u15822789 天前824

全部回覆(2)我來回復

  • 大家讲道理

    大家讲道理2017-06-30 09:56:57

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

    回覆
    0
  • 某草草

    某草草2017-06-30 09:56:57

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

    __all__ = ["Sendmsg","Receivemsg"]
    
    from . import Sendmsg
    from . import Receivemsg

    如圖:

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

    回覆
    0
  • 取消回覆