這篇文章給大家介紹Python3中的Import的作用有哪些,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),武侯企業(yè)網(wǎng)站建設(shè),武侯品牌網(wǎng)站建設(shè),網(wǎng)站定制,武侯網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,武侯網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。Python import的搜索路徑
import的搜索路徑為:
搜索「內(nèi)置模塊」(built-in module)
搜索 sys.path 中的路徑
而sys.path在初始化時(shí),又會(huì)按照順序添加以下路徑:
foo.py 所在目錄(如果是軟鏈接,那么是真正的 foo.py 所在目錄)或當(dāng)前目錄;
環(huán)境變量 PYTHONPATH中列出的目錄(類似環(huán)境變量 PATH,由用戶定義,默認(rèn)為空);
site 模塊被 import 時(shí)添加的路徑1(site 會(huì)在運(yùn)行時(shí)被自動(dòng) import)。
import site 所添加的路徑一般是 XXX/site-packages。如果懶得記 sys.path 的初始化過程,可以簡單的認(rèn)為 import 的查找順序是:
內(nèi)置模塊
.py 文件所在目錄
pip 或 easy_install 安裝的包
絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入
絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入的關(guān)系可以類比絕對(duì)路徑和相對(duì)路徑。
絕對(duì)導(dǎo)入的格式為:
import A.B 或 from A import B
相對(duì)導(dǎo)入格式為:
from . import B 或 from ..A import B
其中,點(diǎn)號(hào).代表當(dāng)前模塊,..代表上層模塊,…代表上上層模塊,依次類推。
模塊的執(zhí)行方式
模塊的執(zhí)行可以有兩種方式:直接執(zhí)行和以模塊執(zhí)行,即:
python example/foo.py 或 python -m example.foo
注意,以模塊執(zhí)行時(shí),一定要有包的概念,即example一定是個(gè)包,而foo是這個(gè)包下的模塊,這樣才能順利執(zhí)行。
包和模塊
模塊: 一個(gè) .py 文件就是一個(gè)模塊(module)
包: init .py 文件所在目錄就是包(package)
各種情形測試
模塊直接導(dǎo)入
即模塊所在的目錄都不是一個(gè)包結(jié)構(gòu),各個(gè)模塊都是獨(dú)立的,比如以下的目錄結(jié)構(gòu):
D:\LEARN\IMPORT_TEST\TEST1 ├─pack1 │ modu1.py └─pack2 modu2.py
modu1.py中的內(nèi)容為:
import sys sys.path.append("D:\\learn\\import_test\\TEST1\\pack2") from modu2 import hello2 hello2()
modu2.py中的內(nèi)容為:
def hello2(): print("hello, I am module 2")
注意在modu1中一定加上sys.path.append那部分內(nèi)容,即根據(jù)上面的描述,一定要讓modu1能找到modu2才行,否則就會(huì)出現(xiàn)如下錯(cuò)誤:
ModuleNotFoundError: No module named 'modu2'
此時(shí)進(jìn)入pack1目錄下,以直接執(zhí)行或模塊執(zhí)行的方式都可以順利輸出。
包外導(dǎo)入
將上面兩個(gè)模塊所在的目錄都變?yōu)榘Y(jié)構(gòu),即:
D:\LEARN\IMPORT_TEST\TEST2 ├─pack1 │ modu1.py │ __init__.py └─pack2 modu2.py __init__.py
此時(shí)也能順利執(zhí)行,同時(shí)比上面非包結(jié)構(gòu)的多出來一條執(zhí)行方式,即:
python -m pack1.modu1
即以包名+模塊名的方式執(zhí)行。
上面兩種情形,即模塊與模塊、包與包都是相互獨(dú)立的關(guān)系,也就沒有相對(duì)導(dǎo)入的意義。
如果是在一個(gè)包內(nèi)的不同模塊的導(dǎo)入,那么最自然的就是使用相對(duì)導(dǎo)入。
包內(nèi)相對(duì)導(dǎo)入
D:\LEARN\IMPORT_TEST\Test3 │ __init__.py │ ├─pack1 │ modu1.py │ __init__.py │ └─pack2 modu2.py __init__.py
此時(shí)modu1.py中的內(nèi)容為:
from ..pack2.modu2 import hello2 hello2()
即將sys.path.append去掉,因?yàn)槭窃谝粋€(gè)包內(nèi)相互引用,此時(shí)這樣寫沒有意義。
此時(shí)正確運(yùn)行的方式是進(jìn)入Test3上一層的文件夾,然后:
python -m Test3.pack1.modu1
即明確地告訴解釋器模塊的層次結(jié)構(gòu)。
而如果采用直接運(yùn)行的方式,比如:
python Test3\pack1\modu1.py
就會(huì)報(bào)如下錯(cuò)誤:
ValueError: attempted relative import beyond top-level package
這是因?yàn)?,相?duì)導(dǎo)入使用模塊的 name (這里的name和下面的main都是有兩個(gè)下劃線的,但是網(wǎng)頁顯示不出來。。)屬性來決定模塊在包結(jié)構(gòu)中的位置。當(dāng) name 屬性不包含包信息(i.e. 沒有用'.'表示的層次結(jié)構(gòu),比如' main ‘),則相對(duì)導(dǎo)入將模塊解析為頂層模塊,而不管模塊在文件系統(tǒng)中的實(shí)際位置。這里模塊被直接運(yùn)行,則它自己為頂層模塊,不存在層次結(jié)構(gòu),所以找不到其他的相對(duì)路徑。
因此,直接運(yùn)行帶有相對(duì)導(dǎo)入的模塊是不行的,需要通過模塊運(yùn)行的方式,將包結(jié)構(gòu)明確告訴它才行。
這個(gè)原理也適用于下面這種錯(cuò)誤,比如將modu2移動(dòng)到pack1中,即與modu1在同一個(gè)目錄下,然后將modu1的內(nèi)容改為這樣的相對(duì)引用:
from .modu2 import hello2 hello2()
此時(shí)使用模塊執(zhí)行的方式?jīng)]有問題,如果還是想嘗試直接運(yùn)行,那么就會(huì)出現(xiàn):
ModuleNotFoundError: No module named '__main__.modu2'; '__main__' is not a package
原因就是此時(shí)沒有包結(jié)構(gòu), main 也不是個(gè)包。
那么解決方法就是或者使用模塊運(yùn)行的方式運(yùn)行,或者將它改成下面的絕對(duì)導(dǎo)入的方式就可以直接運(yùn)行。
包內(nèi)絕對(duì)導(dǎo)入
那么,如果將modu1.py中的內(nèi)容改為絕對(duì)導(dǎo)入,即:
from Test3.pack2.modu2 import hello2 hello2()
此時(shí)正確運(yùn)行方式也是進(jìn)入Test3上一層文件夾,然后使用模塊執(zhí)行的方式運(yùn)行:
python -m Test3.pack1.modu1
如果此時(shí)采用直接運(yùn)行的方式:
python Test3\pack1\modu1.py
那么就會(huì)報(bào)錯(cuò):
ModuleNotFoundError: No module named 'Test3'
這主要是因?yàn)門est3沒有被找到,即按照第一部分所說,Test3沒有在import的搜索路徑中。所以,只要將它加入進(jìn)去即可,比如:
set PYTHONPATH=D:\learn\import_test\
此時(shí)再直接運(yùn)行就沒有問題了。
關(guān)于Python3中的Import的作用有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
分享題目:Python3中的Import的作用有哪些-創(chuàng)新互聯(lián)
URL標(biāo)題:http://www.rwnh.cn/article16/ceghdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、App開發(fā)、網(wǎng)站設(shè)計(jì)、服務(wù)器托管、靜態(tài)網(wǎng)站、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容