python 模組與包的匯入
一、模組
何為模組?
模組是最高級別的程式組織單元;在python中,模組一般是python或C或Java等語言編寫的擴充套件檔案,這個擴充套件檔案可以被匯入使用。
為何使用模組?
模組首先是一個檔案,這個檔案可以在多種環境下任意次數地重新載入和重新執行,這就是說,模組可被重用;其次,模組作為python中最高級別的程式組織單元,在每一次匯入時,客戶端只需匯入模組,就能使用模組定義的變數名以及變數名所引用的物件。
模組的匯入前提
1、匯入模組是由python自身提供的,在python標準連結庫中。
2、模組匯入的兩個語句(import和from)
3、初次匯入模組時,需要先找到要匯入的模組檔案,在sys.path的路徑中
尋找。
4、python把載入的模組儲存到sys.modules中,在每次匯入操作開始前檢查該字典,如果不存在,會執行匯入操作,如果存在,不執行任何操作。
5、模組檔案的選擇:如要匯入的模組在sys.path字典的第一個路徑和第三個路徑中同時出現,只會匯入第一個路徑中的模組。
模組匯入之import語句
import將整個模組物件賦值給一個變數名
1、import 模組名
>>> import sys
>>> print(sys.path)
['', 'C:\\Python37\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages']
2、import 模組名 as 別名
>>> import sys as systemctl >>> print(systemctl.path) ['', 'C:\\Python37\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages']
3、import 模組1,模組2
>>> import sys,os
模組匯入之from語句
from將一個或多個變數名賦值給另一個模組中同名的物件
1、from 模組名 import 變數名
直接使用變數名就可以完成操作
如果本檔案中有相同的變數名會發生衝突
>>> from sys import path >>> print(path) ['', 'C:\\Python37\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages']
2、from 模組名 import 變數名字 as 別名
>>> from sys import path as systempath
>>> print(systempath)
['', 'C:\\Python37\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages']
3、from 模組名 import 變數1,變數2
>>> from os import path,kill
4、from 模組名 import *
將模組中的所有變數名都放到記憶體中
如果本檔案中有相同的變數名會發生衝突
>>> from os import path,kill
5、from 模組名 import * 和all
沒有all這個變數就會匯入所有的變數
如果有all變數,只匯入all列表中的變數
模組匯入流程
1、先從sys.modules裡檢視是否已經被匯入
2、在sys.path的目錄中找到模組
3、建立這個模組的名稱空間
4、把檔案中的名字放入名稱空間
何為模組名稱空間
每一個模組就是一個名稱空間,存在於模組之內的變數名就是模組物件的屬性
1、模組語句會在首次匯入時執行
2、頂層的賦值語句會建立模組屬性
3、模組的名稱空間能通過屬性dict或dir()來獲取
4、模組檔案的作用域就是模組物件的屬性的名稱空間,即每一個模組都是獨立的作用域
二、包
我們知道通過import和from語句可以匯入模組,用法時直接在語句後跟要匯入的模組名,那麼我們如果要匯入目錄路徑呢?也是可以的,python程式碼的目錄就稱為包,因此,這類匯入稱之為包匯入。包匯入是將要匯入的目錄建立為一個新的名稱空間,目錄中的子目錄和模組檔案就是名稱空間的屬性。
包的匯入
包的匯入與模組的匯入類似,只是加上了目錄層級
import dir1.dir2.pic
from dir1.dir2 import pic
匯入包的路徑與匯入模組一致
就是說dir1所在的目錄必須在sys.path中
init.py檔案
包匯入語句的路徑中的每個目錄內都必須有init.py檔案,否則匯入包就會失敗;示例中dir1和dir2的目錄下必須有init.py檔案
包的初始化
匯入包時,會自動執行該目錄下init.py檔案中的所有程式碼,因此這個檔案是放置匯入包時初始化的程式碼,比如寫入匯入其他目錄及模組
包的相對路徑匯入
在上面的匯入中,是從頂層目錄向下逐步找到要匯入的檔案的,給出的是絕對路徑;包也可以相對路徑匯入,類似於linux系統中 “.” 與“..”。
from ..import pic
相對匯入只適用於包內部匯入,且只適用於from語句
init檔案中如使用相對路徑匯入,在包的外部匯入沒問題,在包內部使用也需使用相對路徑
如使用絕對路徑匯入,在內部或外部使用都沒問題
三、name變數
在模組中有個變數name
當我們直接執行這個模組的時候,name=='main'
當我們執行其他模組,在其他模組中引用這個模組的時候,這個模組中的name=='模組的名字'