Python檔案的匯入
因python裡的包和模組應用很靈活,之前梳理過一版但理解不是很透徹,又重新花時間梳理了下,儘量在以後回顧起來清晰易懂。
1. 檔案的組織
以下為python常見組織檔案的形式:
test/
|-- module.py
|-- package1
| |-- module1.py
| `-- module2.py
`-- package2
`-- module1.py
package:資料夾下存在__init__.py
檔案(沒有init檔案看作名稱空間包),那麼該資料夾被python認為是一個包,可以包含很多的模組。
module:以.py
為字尾的單個檔案稱作模組,可以包含類、函式、變數。
2. 檔案的匯入
2.1 匯入的方式
匯入檔案目的就是為了執行檔案,匯入python檔案有兩種方式:
- 直接執行,即
python module.py
- 被其他檔案引入執行,使用import語句匯入,即
import package.module
對於直接執行的檔案,會被當做頂層檔案來執行,頂層檔案又可以稱為入口檔案,即程式是從這個檔案開始的。
2.2 import使用形式
在引入其他檔案時,import有兩種使用形式:
-
import package.module
import只能匯入到模組級別,模組中的類、方法、變數不能被引入,否則提示
ModuleNotFoundError: No module named 'p.m.a'; 'm.a' is not a package
-
from package.module import class
對於from後的import,可以引入任何級別(模組,類,變數等),但import後不可以是
module.class
的形式,否則提示語法錯誤SyntaxError: invalid syntax
3. 包的搜尋路徑
瞭解完檔案的匯入,還要知道檔案從哪裡被搜尋找到的,python提供了sys.path
(需要先import sys
),返回是一個list,用來獲取包的所有搜尋路徑,當進行import操作時,會遍歷所有路徑去查詢,找到了則將其匯入。
測試目錄
test/ |-- main.py print(sys.path)
執行main.py
$ python main.py
['C:\\test','C:\\Python\\Python3.8.5\\DLLs','C:\\Python\\Python3.8.5\\lib','C:\\Python\\Python3.8.5\\lib\\site-packages']
從執行結果可以看到,python在執行時會首先把被執行檔案所在目錄test新增到搜尋路徑中去。
4. 包名和模組名
python同樣還提供了__package__
和__name__
兩個內建變數來表示當前檔案所在的包名以及模組名。
測試目錄
packages_and_modules/
|-- main.py
|-- p1
| |-- m1.py
main.py
print("__package__: " + (__package__ or "沒有所在包名"))
print("__name__: " + __name__)
import p1.m1
m1.py
print("------------p1.m1------------")
print("__package__: " + (__package__ or "沒有所在包名"))
print("__name__: " + __name__)
執行main.py
$ python packages_and_modules/main.py
__package__: 沒有所在包名
__name__: __main__
------------p1.m1------------
__package__: p1
__name__: p1.m1
可以看出兩種不同匯入方式的檔案,__name__
和__package__
也有很大差異。入口檔案已經是最頂層檔案,因此它的包名是None(和入口檔案平級的模組的包名也都為None),而且它的模組名都為__main__
。而對於m1.py,它是被main.py檔案中匯入的,所以包名為p1,模組名為包名.模組名
,即p1.m1