使用Python模塊常見的情況是,事先寫好A.py文件,需要import B.py文件時,先拷貝到當前目錄,然后再import
這樣的做法在程序量較小的情況下是可行的,如果程序交互復雜程度稍高,就很費力了
有一種解決方法可以將多個.py文件組織起來,方便在外部統一調用,和在內部互相調用:python中的 __ init__.py在包調用中起到了重要的作用
首先要明確的Python在執行import包的時候,執行的操作,按照python的文檔描述,操作如下:
a) 創建一個新的,空的module對象(它可能包含多個module);
b) 把這個module對象插入sys.module中
c) 裝載module的代碼(如果需要,首先必須編譯) (首先需要找到module程序所在的位置,其原理為:如果需要導入的module的名字是m1,則解釋器必須找到m1.py,它首先在當前目錄查找,然后是在環境變量PYTHONPATH中查找)
d) 執行新的module中對應的代碼。
Python中的package定義很簡單,其層次結構與.py所在目錄的層次結構相同,比較關鍵的一點是package中必須包含一個__init__.py的文件
例如,我們可以這樣組織一個package: init為頂層目錄
運行結果如下
其中__init__.py可以為空,只要它存在,解釋器對其視作一個package處理。
第一層:pack, pack2, main.py
第二層:
pack: __ init__.py,module_A.py
pack2:__ init__.py,module_B.py
PS:遇到問題沒人解答?需要Python學習資料?可以加點擊下方鏈接自行獲取
note.youdao.com/noteshare?id=2dce86d0c2588ae7c0a88bee34324d76
main.py 調用腳本:
from pack import func1
from pack import func2
from pack2 import print_lst
def main():
func1()
func2()
print_lst()
if __name__ == "__main__":
main()
其中 module_A:
def func1():
print("MODULEAAAAA_func1111")
def func2():
print("MODULEAAAAA_func2222")
同一層 __init __.py
from .module_A import func1
from .module_A import func2
.module_A 表示__ init__.py同一層目錄的module_A
個人理解是:當 main.py調用腳本from pack import func1
由於from操作 會默認目錄下存在pack包,解釋器會首先尋找__init__.py
而__init__.py內容不為空,對module_A引入了兩個函數fun1,fun2,生成了函數引用域(太菜不知道專屬名詞)
所以在main.py 中可以不顯式地指明module_A而直接用: from pack import fun1,fun2
如果把pack下的init.py 的第二行 import func2注釋
也就是說,package內的module的import 是受__ init__.py限制的
有時在import語句中會出現通配符*,導入某個module中的所有元素,這是怎么實現的呢?
答案就在__init__.py中。如果在__init__.py文件中寫(指定)
__all__ = ['module_A']
如果改為
__all__ = []
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named module_A
運行則會報錯,如上
這也就是說,package內的module的導入是受__init__.py限制的
好了,最后來看看,如何在package內部互相調用。
如果希望調用同一個package中的module,則直接import即可。
也就是說,在module_A.py中,可以直接使用import module_others
如果不在同一個package中,例如我們希望在module_A.py中調用module_B.py中的FuncB,則應該這樣:
from module_B的包名(目錄).module_B import funcB