哎。差點找不到之前寫的這篇筆記。
Python引用與目錄結構
模塊的概念
模塊即單個.py文件。
模塊名即文件名。
引用模塊:
-
只在第一次引用時執行、且執行一次。
-
引用及使用方法:
# 僅引模塊 import module m1.fun() ##使用其內變量/函數,必須使用"模塊名."。否則報錯 # 引模塊的特定變量/函數 from module import fun fun() ##不必使用"模塊名."
模塊也是對象,具有一個內置屬性__name__
。該屬性有兩種取值:模塊名
、__main__
。
-
舉例說明取值問題:當在A文件中引入B模塊,A文件的
__name__
取值為__main__
,B模塊的__name__
取值為模塊名
。 -
__name__
的使用場景:在import模塊時,默認情況下,模塊的所有語句都會被執行一次。如果希望模塊中有某些語句,在import時避免執行,可以:if __name__ == 'main': ## 這里的語句將在import時避免執行 ## 因為import時,條件為假
包的概念
包即一個文件夾。
包含了__init__.py
和一系列.py文件。包名即文件夾名。
__init__.py
是為了避免將文件夾名當作普通的字符串,其內容可以為空,一般用來進行包的某些初始化工作或者設置__all__
值,用以暴露該包的 API。
引用時搜索模塊的順序
- 當前文件所在目錄
- 環境變量PYTHONPATH(包含python帶的模塊、自己安裝的模塊),可以通過bash或sys.path修改
python工程常用目錄結構
-
方式一
-- src |-- mod1.py(被引用的模塊) `-- test1.py(主程序)
在
test1.py
中直接import mod1
即可。 -
方式二:
-- src |-- mod1.py(被引用的模塊1) |-- pkg | |-- __init__.py(必須有) | `-- mod2.py(被引用的模塊2) `-- test1.py(主程序)
在
test1.py
中import mod1
在
test1.py
中from pkg import mod2
-
方式三:
-- src |-- mod1.py |-- pkg | |-- __init__.py(必須有) | `-- mod2.py |-- sub | `-- test2.py `-- test1.py
在
test1.py
中import mod1
在
test1.py
中from pkg import mod2
在
test2.py
中import sys sys.path.append("..") ## 臨時加入父目錄 ## 然后就可以正常地: import mod1 from pkg import mod2
在
test1.py
中from pkg import mod2