
python中模塊查找的原理與方法詳解
本文主要給大家介紹了關(guān)于python模塊查找的原理與方式,分享出來供大家參考學(xué)習(xí),下面話不多說,來一起看看詳細(xì)的介紹:
基礎(chǔ)概念
module
模塊, 一個(gè) py 文件或以其他文件形式存在的可被導(dǎo)入的就是一個(gè)模塊
package
包,包含有 __init__ 文件的文件夾
relative path
相對(duì)路徑,相對(duì)于某個(gè)目錄的路徑
absolute path
絕對(duì)路徑,全路徑
路徑查找
python 解釋器查找被引入的包或模塊
Python 解釋器是如何查找包和模塊的
Python 執(zhí)行一個(gè) py 文件,無論執(zhí)行的方式是用絕對(duì)路徑還是相對(duì)路徑,interpreter 都會(huì)把文件所在的 directory 加入 sys.path 這個(gè) list 中,Python 就是在 sys.path 中查找包和模塊的,sys.path 中的內(nèi)容本身又是又 Python 的環(huán)境變量決定。
code-1
執(zhí)行表明相對(duì)路徑和絕對(duì)路徑都輸出相同的結(jié)果,而且無論哪種執(zhí)行方式,test.py 所在的文件夾都會(huì)被加入 sys.path 的首位,也就是索引為0的位置。
Python 解釋器查找包的順序是什么
解釋器查找包,首先搜索 built-in module,其次搜索 sys.path ,這樣的查找順序?qū)?huì)導(dǎo)致同名包或模塊被遮蔽。
code-2
#ls
├── os.py
├── test2.py
├── redis.py
#test2.py
import os
from redis import Redis
#execute test2.py
Traceback (most recent call last):
File "/Users/x/workspace/blog-code/p2016_05_28_python_path_find/test2.py", line 1, in <module>
from redis import Redis
ImportError: cannot import name Redis
由于 os 是 built-in module,即使在同目錄下有同名模塊,解釋器依然可以找到正確的 os 模塊,可以證實(shí) built-in module 不會(huì)被遮蔽,而 redis 屬于第三方模塊,默認(rèn)安裝位置是 Python 環(huán)境變量中的 site-packages,解釋器啟動(dòng)之后會(huì)將此目錄中的內(nèi)容加入 sys.path,由于當(dāng)前目錄會(huì)在 sys.path 的首位,當(dāng)前目錄的 redis 優(yōu)先被找到,site-packages 中的 redis 模塊被遮蔽了。
交互式執(zhí)行環(huán)境的查找順序
進(jìn)入交互式執(zhí)行環(huán)境,解釋器會(huì)自動(dòng)把當(dāng)前目錄加入 sys.path, 這時(shí)當(dāng)前目錄是以相對(duì)路徑的形式出現(xiàn)在 sys.path 中:
>>> import os.path
>>> import sys
>>> os.path.abspath(sys.path[0])
'/Users/x/workspace/blog-code'
>>>
除此之外,其他與執(zhí)行一個(gè)文件是相同的。
模塊中的 __file__ 變量
__file__ is the pathname of the file from which the module was loaded, if it was loaded from a file. 如果一個(gè)模塊是從文件加載的,__file__ 就是該模塊的路徑名–Python Doc:
顧名思義,當(dāng)模塊以文件的形式出現(xiàn) __file__ 指的是模塊文件的路徑名,以相對(duì)路徑執(zhí)行 __file__ 是相對(duì)路徑,以絕對(duì)路徑執(zhí)行 __file__ 是絕對(duì)路徑。
#test3.py
print __file__
#相對(duì)路徑執(zhí)行
python test3.py
test3.py
#絕對(duì)路徑執(zhí)行
python /Users/x/workspace/blog-code/p2016_05_28_python_path_find/test3.py
/Users/x/workspace/blog-code/p2016_05_28_python_path_find/test3.py
為了保證__file__ 每次都能準(zhǔn)確得到模塊的正確位置,最好對(duì)其再取一次絕對(duì)路徑 os.path.abspath(__file__) 。
交互式 shell 中的 __file__
>>> __file__
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name '__file__' is not defined
這是因?yàn)楫?dāng)前交互式shell的執(zhí)行并不是以文件的形式加載,所以不存在__file__ 這樣的屬性。
sys.argv[0] 變量
sys.argv[0] 是它用來獲取主入口執(zhí)行文件。
#test.py
import sys
print __file__
print sys.argv[0]
以上 print 輸出相同的結(jié)果,因?yàn)橹鲌?zhí)行文件和__file__所屬的模塊是同一個(gè),當(dāng)我們改變?nèi)肟谖募?,區(qū)別就出現(xiàn)了。
#test.py
import sys
print __file__
print sys.argv[0]
#test2.py
import test
#execute test2.py
/Users/x/workspace/blog-code/p2016_05_28_python_path_find/child/test.py #__file__
test2.py #sys.argv[0]
總的來說,sys.argv[0] 是獲得入口執(zhí)行文件路徑,__file__ 是獲得任意模塊文件的路徑。
sys.modules 的作用
既然 Python 是在 sys.path 中搜索模塊的,那載入的模塊存放在何處?答案就是 sys.modules。模塊一經(jīng)載入,Python 會(huì)把這個(gè)模塊加入 sys.modules 中供下次載入使用,這樣可以加速模塊的引入,起到緩存的作用。
>>> import sys
>>> sys.modules['tornado']
Traceback (most recent call last):
File "<input>", line 1, in <module>
KeyError: 'tornado'
>>> import tornado
>>> sys.modules['tornado']
<module 'tornado' from '/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc'>
前面說過 Python 解釋器啟動(dòng)之后,會(huì)把預(yù)先載入 built-in module,可以通過 sys.modules 驗(yàn)證。
>>> sys.modules['os']
<module 'os' from '/Users/x/python_dev/lib/python2.7/os.pyc'>
>>>
借助 sys.modules 和 __file__,可以動(dòng)態(tài)獲取所有已加載模塊目錄和路徑。
>>> import os
>>> os.path.realpath(sys.modules['os'].__file__)
'/Users/x/python_dev/lib/python2.7/os.pyc'
>>> import tornado
>>> os.path.realpath(sys.modules['tornado'].__file__)
'/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc'
def get_module_dir(name):
path = getattr(sys.modules[name], '__file__', None)
if not path
raise AttributeError('module %s has not attribute __file__'%name)
return os.path.dirname(os.path.abspath(path))
summary
總的來說,Python 是通過查找 sys.path 來決定包的導(dǎo)入,并且系統(tǒng)包優(yōu)先級(jí)>同目錄>sys.path,Python 中的特有屬性 __file__ 以及 sys.argv[0] ,sys.modules 都能幫助我們理解包的查找和導(dǎo)入概念,只要能正確理解 sys.path 的作用和行為,理解包的查找就不是難題了。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03