2015-08-22 374 views
1

我正在學習Python,並在學習模塊時出現了兩個疑問。在Python中導入模塊

  • 疑問#1:

    我知道模塊只是簡單的Python文件,如filename.py,但什麼是一個子模塊在Python?

  • 疑點2:

    考慮以下三行代碼:

    import modulename 
    from pkgname import modulename 
    from pkgname import * 
    

    是否所有的三個語句使用__init__.py(這是內部pkgname包),或僅第三條語句?

+1

** 1。**子模塊是包內的模塊。 ** 2。**''pkgname/__ init __。py'用於導入'pkgname'或其子模塊之一(即示例中的第2行和第3行)。 –

+0

一個包如何包含子模塊,我的意思是我知道一個包可以包含模塊或子包(dimply目錄)。但如何子模塊?請給我任何例子。 –

+0

由於程序包本身也是一個模塊(在'__init __。py'中定義的內容),該程序包中的任何模塊都可以被視爲該程序包/模塊的子模塊。 – BlackJack

回答

4

爲了讓你的第二個問題更清晰一些。


當你這樣做 -

import packagename.modulename 

from packagename import modulename 

Python的國內第一進口packagename,當我說蟒蛇進口packagename,我的意思是導入該軟件包的__init__.py,然後進口modulename。這就是爲什麼當你執行上述任何操作時,它會導入__init__.py


當你這樣做 -

from packagename import * 

請注意,這並不包名默認導入modulename,這將只導入從包名的__init__.py,和您在__all__列表中列出的所有模塊在__init__.py中,如果在該列表中沒有列出模塊,則不會導入任何模塊。示例 -

可以說我有

shared 
    -- __init__.py 
    -- a.py 

__init__.py樣子 -

print("In Shared") 

a.py樣子 -

print("In A") 

現在,在上述shared目錄時,並開通蟒蛇,如果你這樣做 -

from shared import * 

這將打印出來 -

In Shared 

但是,如果你在__init__.py更改代碼 -

print("In Shared") 
__all__ = ['a'] 

,做從相同位置相同的進口,這將打印出 -

In Shared 
In A 

正如你所看到的只有導入在__all__列表中定義的子模塊。


最後,當你做 -

import modulename 

比方說,你這樣做,直接從packagename內,通過改變目錄,並開通Python解釋那裏。那時候,你並沒有要求Python爲你導入包名,所以它不需要導入包名,因此它不會導入__init__.py

+0

真棒回覆老兄,你總是以最好的方式幫助我。謝謝老兄再次。 –

+0

很高興我能幫到你:) –

+1

如果你的問題已經得到滿意的回答,我想請求你接受答案(無論你認爲最好還是最能幫助你),只需點擊左邊的刻度線答案的一面,這對社區會有所幫助。 –

3

正如安德烈Corbellini說,在註釋:

  1. 子模塊是一個封裝內的模塊。一個Python包就是一個Python模塊的目錄,它包含一個__init__.py文件。
  2. pkgname/__init__.py用於每次導入pkgname或其子模塊之一(即示例中的第2行和第3行)。你的第一個例子沒有導入包的任何包裝或模塊,因此它不需要使用__init__.py(可以爲空)

如果有這些文件,你是在同一個文件夾

工作
./pkgname/__init__.py # Submodule of pkgname package used on example 3) to import all the submodules 
./pkgname/Asdf.py # Submodule of pkgname package 
./pkgname/modulename.py # Submodule of pkgname package imported in example 2) using __init__.py 
./modulname.py # Module imported on example 1) 
+0

Thanku回覆。 我的第一個疑問已經清除。 但是如果我有第二個疑問,就像你說的 你的第一個例子沒有導入任何包或包**的模塊,因此它不需要使用__init__.py(它可以是空的),但我認爲它是導入模塊(即子模塊),那麼爲什麼它不使用init.py(如你所說)? –

+0

現在可能更清晰 – Llopis

+0

如果是 **。/ modulname.py#模塊在示例1上導入)** 將會有一個名爲** ./init.p **的模塊。在使用import ** import modulename **語句導入**。/ modulname.py **時,它將使用** ./init.p **? –