1. 程式人生 > 實用技巧 >Python檔案的匯入

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檔案有兩種方式:

  1. 直接執行,即python module.py
  2. 被其他檔案引入執行,使用import語句匯入,即import package.module

對於直接執行的檔案,會被當做頂層檔案來執行,頂層檔案又可以稱為入口檔案,即程式是從這個檔案開始的。

2.2 import使用形式

在引入其他檔案時,import有兩種使用形式:

  1. import package.module

    import只能匯入到模組級別,模組中的類、方法、變數不能被引入,否則提示ModuleNotFoundError: No module named 'p.m.a'; 'm.a' is not a package

  2. 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