如何在python?中導(dǎo)入?package
package 在 python 中,是一種有效組織代碼,module 可以是一個(gè)文件,可以通過(guò) import 來(lái)導(dǎo)入一個(gè) module 單個(gè)文件,而 package 則是作為一個(gè)目錄來(lái)導(dǎo)入。隨后我們還會(huì)看一看多層嵌套是如何導(dǎo)入的。
>>> import collections,socket >>> print(collections.__path__) ['/anaconda3/envs/py38/lib/python3.8/collections'] >>> print(socket.__path__) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module 'socket' has no attribute '__path__'
我們看一看 python 提供標(biāo)注庫(kù),例如 collections 和 socket,這里 collections 是一個(gè) package 也就是意味著其是一個(gè)目錄,在 python 文件,而 socket 則是一個(gè) module,對(duì)于 socket 和我們之前介紹導(dǎo)入 module 一樣。package 與 module 不同就是具有 __path__
屬性,我們可以通過(guò) __path__
來(lái)訪問(wèn)到存放 python 文件的路徑。但是對(duì)于 module 并不存在這個(gè)屬性。
在 python 中,有兩種 package,分別是是 regular package 和 namespace package。
regular package:
我們首先來(lái)看一看 regular package,下面是一個(gè) regular package 結(jié)構(gòu)
main.py pkg1 ---__init__.py
在項(xiàng)目下,我們創(chuàng)建一個(gè)文件夾 kpg1 下面有一個(gè)文件 __init__.py
,這樣 package 就是 regular package,這樣這個(gè)文件夾的名稱(chēng)就是一個(gè) package 名稱(chēng),我們導(dǎo)入 package 就可以直接導(dǎo)入這個(gè) package 名稱(chēng)。在 __init__.py
文件里添加如下語(yǔ)句.
print("importing pk1") def hi_say(): print("pkg1 say hi")
在 main.py 我們導(dǎo)入 package 也就是 import pkg1
,python 通過(guò) finder 來(lái)定位到 package 位置,pathFinder 通過(guò)在 sys.path 中的 path 搜索來(lái)定位到 package 的位置。大家還記得嗎? sys.path 第一個(gè) path 就是我們當(dāng)前目錄,這是為什么 python 可以定位到 pkg1 ,就是根據(jù),當(dāng)我們導(dǎo)入 package python 就會(huì)自動(dòng)執(zhí)行 package 下面的 __init__.py
文件。當(dāng)你 import package 時(shí),module 的編譯好 code 對(duì)象,我們可以通過(guò) pkg1.hi_say()
來(lái)。
print(pkg1.__path__)
通過(guò) pkg1 的 __path__
來(lái)方法 pkg1 的目錄絕對(duì)路徑。
print(pkg1.__file__)
而 __file__
對(duì)應(yīng)得到 __init__.py
文件的絕對(duì)路徑。
print(pkg1.__package__)
也可以通過(guò) package 的 __package__
的屬性獲取 package 的名稱(chēng),同樣可以通過(guò) __name__
來(lái)獲取 module 的名稱(chēng)。
接下來(lái)我們進(jìn)一步加大難度,就是 pkg1 文件夾下再新建一個(gè) mod1.py 文件
main.py pkg1 ---__init__.py ---mod1.py
__init__.py
文件
print("importing pk1")
mod1.py 文件中,輸出一條"import mod1"的信息,還定義了 say_hi 函數(shù),接下來(lái)我們想要做的事導(dǎo)入這個(gè) module 然后執(zhí)行其中 say_hi 方法。
print("importing mod1") def say_hi(): print("pkg1 say hi")
import sys import pkg1 print('pkg1' in globals())#True print('pkg1' in sys.modules)#True
我們導(dǎo)入 pkg1 這樣創(chuàng)建一個(gè)指向 module 對(duì)象的引用,然后添加全局變量中,同時(shí)作為 module 也會(huì)被添加到 sys.modules 緩存中。
然后當(dāng)我們直接通過(guò) pkg1.mod1 來(lái)訪問(wèn) mod1 module 會(huì)拋出下面錯(cuò)誤,告訴用戶(hù)并不存在這個(gè)屬性
AttributeError: module 'pkg1' has no attribute 'mod1'
也就是只是簡(jiǎn)單導(dǎo)入 package 并不會(huì)將其下的 module 一同導(dǎo)入,所以才會(huì)出現(xiàn)上面錯(cuò)誤。如果想要導(dǎo)入 pkg1 下 mod1 我們需要使用 import pkg1.mod1
這樣正確方式來(lái)導(dǎo)入 mod1
import sys import pkg1.mod1
大家注意一下當(dāng)我們導(dǎo)入 mod1 正確方式是用 import pkg1.mod1,從下面輸出來(lái)看,python 先執(zhí)行 __init__.py
,也就是說(shuō) python 會(huì)先導(dǎo)入 package pkg1 然后再導(dǎo)入 module1 這樣順序。
importing pk1 importing mod1
如果下面方式可以訪問(wèn)到 module mod1 中的 say_hi() 方法。
pkg1.mod1.say_hi()
print('pkg1' in sys.modules)#True print('pkg1.mod1' in sys.modules)#True print('pkg1' in globals())#True print('pkg1.mod1' in globals())#False
通過(guò)上面輸出我們發(fā)現(xiàn) pkg1 和 pkg1.mod1 都存在于 sys.modules 緩存中,還有不難看出只有 pkg1 位于全局變量,我們只能通過(guò) pkg1 的屬性來(lái)方法 mod1。
簡(jiǎn)單總結(jié)一下,我們要方法一個(gè) package 下的 module,首先會(huì)訪問(wèn)這個(gè) package 會(huì)執(zhí)行 package 下的 __init__.py
然后再去執(zhí)行 module 代碼,在 sys.modules 保存 pkg1 和 pkg1.mod1 分別指向保存兩個(gè) module 對(duì)象的內(nèi)存地址。
到此這篇關(guān)于 如何在python 中導(dǎo)入 package 的文章就介紹到這了,更多相關(guān)在 python 中導(dǎo)入 package 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python異常模塊traceback用法實(shí)例分析
這篇文章主要介紹了Python異常模塊traceback用法,結(jié)合實(shí)例形式分析了Python異常模塊traceback的基本功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-10-10Python中sort函數(shù)正則表達(dá)式的使用
在python中,sort是列表排序的一種方法,本文就來(lái)介紹一下sort函數(shù)正則表達(dá)式的使用以及與sorted的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03python使用tkinter實(shí)現(xiàn)屏幕中間倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了python使用tkinter實(shí)現(xiàn)屏幕中間倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03Django實(shí)現(xiàn)圖片文字同時(shí)提交的方法
這篇文章主要介紹了Django實(shí)現(xiàn)圖片文字同時(shí)提交的方法,較為詳細(xì)的分析了Django+jQuery實(shí)現(xiàn)圖片與文字同時(shí)提交的相關(guān)技巧,需要的朋友可以參考下2015-05-05Python 實(shí)現(xiàn)給圖片加文字或logo水印
本文主要為大家介紹了給圖片添加文字或者logo圖片水印的python工具,從而打造你的專(zhuān)屬圖片。代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以了解一下2021-11-11Pandas數(shù)據(jù)類(lèi)型自行變換及數(shù)據(jù)類(lèi)型轉(zhuǎn)換失敗問(wèn)題分析與解決
這篇文章主要介紹了Pandas數(shù)據(jù)類(lèi)型自行變換及數(shù)據(jù)類(lèi)型轉(zhuǎn)換失敗問(wèn)題分析與解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06