當我們使用 import 語句匯入模組時,python直譯器首先會去內建命名空間中尋找,即判斷匯入的模組是不是內建模組(例如time模組就是python內建模組),然後再去 sys.path 列表中定義的路徑從前往後尋找 .py檔案
如下是在個人筆記本上輸出的 sys.path列表:
>>
>
import sys
>>
> sys.path[''
,'d:\\pycharm\\pychon_jieshiqi\\python37.zip'
,'d:\\pycharm\\pychon_jieshiqi\\dlls'
,'d:\\pycharm\\pychon_jieshiqi\\lib'
,'d:\\pycharm\\pychon_jieshiqi'
,'d:\\pycharm\\pychon_jieshiqi\\lib\\site-packages'
]>>
>
包是乙個有層次的檔案目錄結構,它定義了由相關的(或者說是在這個模組裡需要呼叫另乙個模組)n個模組或n個子包。包含__init__.py檔案的目錄,這個目錄下一定的有則會個__init__.py檔案和其他模組或子包。在呼叫這個包時都會執行package 包下和子包下的init檔案。
現在有如下目錄結構:
├─root
│ ├─pk_1
│ │ ├─__init__.py
│ │ ├─m1.py
│ ├─pk_2
│ │ ├─__init__.py
│ │ └─m2.py
│ ├─__init__.py
│ ├─test.py
pk_1 和 pk_2 包中的init.py 檔案都為空,root包下的 test.py 想要使用 pk_1 包下 m1模組中的方法,可以使用如下語句:
#test.py
from pk_1 import m1
m1.fun_1(
)# fun_1() 為m1模組中的方法
但是使用如下語句,就會丟擲異常:
#test.py
from pk_1 import
*m1.fun_1(
)# 異常資訊:
nameerror: name 'm1'
isnot defined
****
****
****
****
****
****
****
****
****
****
****
****
****
****
****
*******
****
****
****
****
****
****
****
****
****
****
****
****
****
****
*******
#test.py
import pk_1
pk_1.m1.fun_1(
)# 異常資訊:
attributeerror: module 'pk_1' has no attribute 'm1'
這時候可以在 pk_1 包中的__init__.py 中 進行 包提公升(在包中提公升匯入許可權),pk_1 包的init.py 檔案內容如下:
#pk_1包下的_init_.py
from pk_1.m1 import fun_1
然後在 test.py 檔案中可以直接通過包名引入方法:
from pk_1 import fun_1 # 或 from pk_1 import *
fun_1(
)
import pk_1
pk_1.fun_1(
)
這個就是 包中init.py 檔案存在的意義,可以將相關的匯入語句 或 提公升匯入許可權的語句 寫在init.py檔案中,這樣使用者就不需要了解包中的內部結構,可以直接通過包名 呼叫該包(package)中某個模組的方法~
參照其他程式語言的乙個喊法;完成一定功能的**集合,具體表現可以是乙個模組,也可以是包。庫可以理解為倉庫,例如標準庫,則是一組很多的想numpy,matplotlib等這麼多的包,或者模組。
模組《包《庫
import m #匯入單個模組
import p.m #匯入p包裡的某單個模組,會自動執行p裡面的__init__.py檔案
import p.sub_p.m #匯入p包裡的子包sub_p裡的單個m模組,會自動執行p裡的__init__.py和sub_p裡的__init__.py檔案
import m1,m2 #匯入多個模組,或者用兩次import
補充:如果匯入的是乙個包:
①預設不會匯入任何模組
②解決方案:②.1 在__init__.py檔案中,再次匯入需要的模組(該模組需要指定乙個絕對路徑,例如加上包名)
②.2 應該以from ... import ... 的形式匯入(包》模組》模組資源),匯入模組資源時也可以是多個。
注意匯入順序:從from到import的順序應該是包》模組》模組資源這樣從大到小的順序
python模組匯入與模組包匯入
main.py程式第一次匯入指定檔案mod.py時,執行 找到模組檔案mod.py 編譯成位元組碼 可選 執行.pyc位元組碼,建立mod.py中定義的物件。匯入模組後,模組物件會被儲存在sys.modules的表中。每次匯入時,若此表中已存在相關模組,以上3步會被跳過。1.搜尋模組檔案 按順序 程...
python 包 模組匯入
os.getenv path 系統可執行程式位置 sys.path可匯入的python包位置 python module 的 path 屬性 可顯示每個包的檔案位置 what is pythonpath,what is python package what can we do with init ...
匯入模組 包
什麼是模組 乙個模組就是包含了python定義和宣告的檔案,檔名就是模組名字加上.py 但其實import載入的模組分為4個通用類別。1 使用python編寫的 2 已被編譯為共享庫或dll的c或c 擴充套件 3 包好一組模組的包 4 使用c編寫並鏈結到python直譯器的內建模組 如何匯入模組 同...