我正在學習Python,並在學習模塊時出現了兩個疑問。在Python中導入模塊
疑問#1:
我知道模塊只是簡單的Python文件,如
filename.py
,但什麼是一個子模塊在Python?疑點2:
考慮以下三行代碼:
import modulename from pkgname import modulename from pkgname import *
是否所有的三個語句使用
__init__.py
(這是內部pkgname
包),或僅第三條語句?
我正在學習Python,並在學習模塊時出現了兩個疑問。在Python中導入模塊
疑問#1:
我知道模塊只是簡單的Python文件,如filename.py
,但什麼是一個子模塊在Python?
疑點2:
考慮以下三行代碼:
import modulename
from pkgname import modulename
from pkgname import *
是否所有的三個語句使用__init__.py
(這是內部pkgname
包),或僅第三條語句?
爲了讓你的第二個問題更清晰一些。
當你這樣做 -
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
。
真棒回覆老兄,你總是以最好的方式幫助我。謝謝老兄再次。 –
很高興我能幫到你:) –
如果你的問題已經得到滿意的回答,我想請求你接受答案(無論你認爲最好還是最能幫助你),只需點擊左邊的刻度線答案的一面,這對社區會有所幫助。 –
正如安德烈Corbellini說,在註釋:
__init__.py
文件。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)
Thanku回覆。 我的第一個疑問已經清除。 但是如果我有第二個疑問,就像你說的 你的第一個例子沒有導入任何包或包**的模塊,因此它不需要使用__init__.py(它可以是空的),但我認爲它是導入模塊(即子模塊),那麼爲什麼它不使用init.py(如你所說)? –
現在可能更清晰 – Llopis
如果是 **。/ modulname.py#模塊在示例1上導入)** 將會有一個名爲** ./init.p **的模塊。在使用import ** import modulename **語句導入**。/ modulname.py **時,它將使用** ./init.p **? –
** 1。**子模塊是包內的模塊。 ** 2。**''pkgname/__ init __。py'用於導入'pkgname'或其子模塊之一(即示例中的第2行和第3行)。 –
一個包如何包含子模塊,我的意思是我知道一個包可以包含模塊或子包(dimply目錄)。但如何子模塊?請給我任何例子。 –
由於程序包本身也是一個模塊(在'__init __。py'中定義的內容),該程序包中的任何模塊都可以被視爲該程序包/模塊的子模塊。 – BlackJack