載入順序:記憶體--》內建--》sys.path(一系列自定義模組)
import sys
sys.path #環境變數:存放檔案路徑的列表
重點:預設列表的第乙個元素就是當前被執行檔案所在的目錄
可以自定義往sys.path新增路徑
sys.path.insert(0,r'想匯入的模組的絕對路徑') #新增到指定索引,索引就決定了自定義模組的查詢順序
匯入模組的指令:
-- 相對於 函式名() 呼叫函式體,函式呼叫會進入函式體,從上至下逐句解釋執行函式體**
-- 匯入模組,會進入模組檔案,從上至下逐句解釋執行模組檔案**
-- 如果在模組中又遇到匯入其他模組,會接著進入匯入的模組,從上至下逐句解釋執行檔案中的**,以此類推
模組之間會出現迴圈匯入的問題,如:m1.py中匯入了m2,m2.py中又匯入了m1
# m1.py檔案
import m2
x = 10
print(m2.y)
# m2.py檔案
import m1
y = 10
print(m2.x)
迴圈匯入的問題:
-- 匯入模組是要使用模組中的變數
-- 正常邏輯都是在檔案最上方先完成對模組的匯入,再在下方自定義自身模組變數,以及使用匯入的模組中的變數
-- 由於匯入模組的特殊機制,第一次匯入模組時會編譯執行匯入的模組,也就是進入模組逐句執行模組內容,再次匯入只是使用記憶體中的名字,就會出現下面的情況,m2在使用m1中的變數x,但變數x卻並未產生,這就產生了迴圈匯入問題
解決迴圈匯入的問題:延後匯入
1、將迴圈匯入對應包要使用的變數提前定義,再匯入相應的包
2、將導包的路徑放到函式體中,保證存放導包邏輯的函式呼叫在要使用的變數定義之後
示例:
def fn():
import mm4
print(mm4.arg)
num = 66666 # 要使用的變數
fn() # 之後呼叫導包邏輯
重點:
問題:from導包極易出現迴圈匯入問題
解決:建議from匯入方式改用import匯入方式
包通過資料夾來管理一系列功能相近的模組
包:一系列模組的集合體
重點:包中一定有乙個專門用來管理包中所有模組的檔案
包名:存放一系列模組的資料夾名字
包名(包物件)存放的是管理模組的那個檔案的位址,指向其全域性命名空間
import本質:通過查詢環境變數(sys.path)中的絕對路徑來完成匯入
導包:1、保證包所在資料夾在環境變數中
2、匯入的資料夾名就是包名
1、編譯執行包中的__init__.py檔案,會在包中__pycache__建立對應的pyc檔案
2、產生__init__.py檔案的全域性命名空間,用來存放__init__出現的名字
3、產生包名指向__init__.py檔案的全域性命名空間 | 指定變數名指向包中指定名字
總結:包名為資料夾名,命名空間是__init__.py產生的
使用包中模組中的名字:採用import匯入
注意點:
1、在包__init__.py中不建議使用import匯入
2、在包__init__.py中不建議使用as起別名
總結:不建議__init__.py中採用import管理名字 ==> 空著不寫
在使用檔案中
直接在要使用的檔案中用import一層層找到你想要的名字
import 包名.檔名 as 別名
起完別名,原名不可以再使用
原名:包名.檔名 => 包名.檔名.變數名
別名:別名 => 別名.變數名
在包的__init__檔案中
import 模組名 # 問題:所屬包不在環境變數,報錯
import 包名.模組名 # 問題:包所屬資料夾不在檔案變數,報錯
import 包名.模組名 as 別名 # 在外界:包名.模組名 | 包名.別名 都可以訪問
import 包名.模組名.名字 # 問題:導包語句.語法左側必須全部是包(資料夾)
import 包名
包名.名字 # 訪問的是__init__中的名字
包名.模組 # 訪問的模組這個位址
包名.模組.名字 # 訪問的模組中的名字
import 包名.模組
包名.模組 # 訪問的模組這個位址
包名.模組.名字 # 訪問的模組中的名字
from 包名 import 模組
模組 # 訪問的模組這個位址
模組.名字 # 訪問的模組中的名字
from 包名.模組 import 名字
名字 # 訪問的模組中的名字
沒有子包
①pk包
-- __init__.py
-- 名字 a = 10
-- pkm.py
-- 名字 b = 20
在外界import pk
pk.a 訪問a
pk.b 訪問b
init管理檔案
a不需要操作
from .pkm import b
有子包①
pk包-- __init__.py
sub子包
-- __init__.py
名字 x = 10
-- subm.py
名字 y = 10
在外界import pk
pk.x 訪問x
pk.y 訪問y
在pk的init管理檔案
from .sub import x
from .sub.subm import y
②pk包
-- __init__.py
sub子包
-- __init__.py
名字 x = 10
-- subm.py
名字 y = 10
在外界import pk
pk.sub.x 訪問x
pk.sub.y 訪問y
在pk的init管理檔案:要產生sub名字
from . import sub => pk.sub
在sub的init管理檔案:要產生x,y名字
x不需要操作 => pk.sub.x
from .subm import y => pk.sub.y
注:有相對匯入.語法的檔案都不能自執行
python包的概念
python的包就是乙個資料夾 這個資料夾與普通資料夾的區別在於他必須包含乙個 init py的檔案 這個檔案可以包含 也可以沒有內容 只是用於標識乙個包 這個檔案本身是乙個模組 這個模組的名字是資料夾的名字 而不是 包名.init 而是包的名字 即這個資料夾的名字 命名空間 import只能匯入模...
python包的概念
1 python程式由包 package 模組 module 和函式組成。包是由一系列模組組成的集合。模組是處理某一類問題的函式和類的集合。2 包就是乙個完成特定任務的工具箱。3 包必須含有乙個 init py檔案,它用於標識當前資料夾是乙個包。4 python的程式是由乙個個模組組成的。模組把一組...
Python模組和包的概念
模組 模組是python組織 的基本方式。乙個python指令碼可以單獨執行,也可以匯入到另乙個指令碼中執行,當指令碼被匯入執行時,我們將其稱為模組 module 所有的.py檔案都可以作為乙個模組匯入。模組名與指令碼的檔名相同。模組是乙個可以匯入的python指令碼檔案。例如我們編寫了乙個名為he...