python模組匯入與模組包匯入

2021-10-07 06:24:26 字數 3017 閱讀 7121

main.py程式第一次匯入指定檔案mod.py時,執行:

找到模組檔案mod.py

編譯成位元組碼(可選)

執行.pyc位元組碼,建立mod.py中定義的物件。

匯入模組後,模組物件會被儲存在sys.modules的表中。每次匯入時,若此表中已存在相關模組,以上3步會被跳過。

1. 搜尋模組檔案

按順序:

程式主目錄

包含頂層程式檔案(_name_ == 『_main_』 )的目錄。

pythonpath目錄

環境變數,以支援跨目錄匯入。

標準庫目錄

安裝python時標準庫安裝的目錄。

.pt**件目錄

文字檔案。

內建的sys.path列表,儲存了按上述順序載入的路徑,python會按索引順序依次搜尋路徑下的模組檔案。可在**中,為此列表新增新的搜尋路徑。

2. 編譯位元組碼

3. 執行位元組碼,建立模組中的物件

在模組檔案mod.py中,從上至下執行mod.py的頂層語句。若頂層語句做了什麼事情,在import時就會被執行。函式的定義其實就是賦值,將建立的函式物件賦值給函式名。

乙個模組就是乙個物件。模組名為引用此物件的變數。模組中定義的物件(全域性變數,函式,類等)成為模組物件的屬性。import from 是賦值語句,和def那樣,將模組物件賦值給模組名變數。

import x

from x import a

from x import *

from語句同樣執行import的3個步驟,額外地,還會使用模組中同名的變數對被匯入的幾個(或全部)變數名進行賦值。此過程與函式的引數傳遞類似。因此,這些匯入的變數名與模組物件的同名屬性共享引用。若所引用物件是可變的,from引入的變數名可修改模組中的同名變數所引用的可變物件。

import匯入模組物件mod後,可通過為mod的屬性賦值來修改其屬性。mod.a = 10。

root:

data:

__init__.py

mydata.py

model:

__init__.py

net1.py

net2.py

main.py

對於如上檔案目錄關係,整個專案在root資料夾中,2個子目錄datamodel包含了不同的模組檔案。

這裡,data和model就是模組包,即乙個包含python**的資料夾

包中可以有__init__.py檔案,包就是乙個模組,又分為命名空間模組普通模組

每次匯入包的時候,如果有__init__.py檔案,將會自動執行這個檔案中的**,所以也可以認為__init__.py是包的初始化檔案。在python3.3之前,這個檔案必須存在,否則就會報錯,因為它不認為目錄是有效的模組。

包匯入格式

# main.py

import data.mydata

import model.net1

from model import net2

from model import

*#錯誤,無法匯入

在執行頂層模組main.py時,sys.path的主目錄路徑是 ~/root。要從主目錄下的子目錄(data, model目錄)開始寫起。import data.mydata語句,會先執行data資料夾下的__init__.py檔案,再執行mydata.py檔案。

也可使用 from import 形式,但是需要注意:

使用 from model import * 時,被匯入的模組名要在包model的__init__.py中控制被匯入的包中的子模組。即在__init__.py中寫定義全域性變數__all__

__all__ =

['net1'

,'net2'

]

列表中的字串控制了能被匯入的包中的子模組。如果沒有定義此列表,from model import * 將只執行model的__init__.py檔案,而不匯入任何其下的子模組。

絕對路徑匯入

當net1.py要匯入另乙個資料夾中的mydata.py時,可以使用如何形式

import data.mydata
此為相對路徑匯入,前提是頂層模組(即被執行的當前檔案)是main.py,如果直接執行net1.py,net1.py中的如上匯入會報錯。

原因是:絕對路徑是指:sys.path中的頂層模組所在的主目錄,以此目錄為起點,一直到目標模組。因此,頂層模組為main.py時,sys.path的主目錄是~/root,接著便是data。但是,頂層檔案為net1.py時,主目錄是~/root/model,其後接data路徑顯然是錯誤的。

相對路徑匯入

from

.data import mydata

相對路徑僅能使用 from import,不能使用import。不推薦使用相對路徑匯入。

1. 對from *匯入者隱藏資料

模組內的頂層定義__all__列表變數,以字串名指定from *能匯入的變數。

模組內的頂層變數名以單下劃線開頭時_varfrom *不會匯入此變數。

若定義了__all__,則優先遵循第1條,即使此列表中包含了_var的變數,from *也能匯入其。

以上2條規則對 import 無效。

2. 模組的自帶屬性

python導模組和包

1 python中的模組 python模組,是乙個python檔案,以.py結尾,包含了python物件的定義和python語句。2 python中的包 包就是資料夾,但該資料夾下必須存在init.py 檔案,該檔案的內容可以為空。直接匯入模組 import time 直接匯入包 import se...

python 包 模組匯入

os.getenv path 系統可執行程式位置 sys.path可匯入的python包位置 python module 的 path 屬性 可顯示每個包的檔案位置 what is pythonpath,what is python package what can we do with init ...

python模組匯入呼叫 Python之匯入模組

要使用乙個模組,我們必須首先匯入該模組。python使用import語句匯入乙個模組。例如,匯入系統自帶的模組math import math 你可以認為math就是乙個指向已匯入模組的變數,通過該變數,我們可以訪問math模組中所定義的所有公開的函式 變數和類 math.pow 2,0.5 pow...