前言
本文主要給大家介紹了關(guān)于python模塊查找的原理與方式,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō),來(lái)一起看看詳細(xì)的介紹:
基礎(chǔ)概念
module
模塊, 一個(gè) py 文件或以其他文件形式存在的可被導(dǎo)入的就是一個(gè)模塊
package
包,包含有 __init__ 文件的文件夾
relative path
相對(duì)路徑,相對(duì)于某個(gè)目錄的路徑
absolute path
絕對(duì)路徑,全路徑
路徑查找
python 解釋器查找被引入的包或模塊
Python 解釋器是如何查找包和模塊的
Python 執(zhí)行一個(gè) py 文件,無(wú)論執(zhí)行的方式是用絕對(duì)路徑還是相對(duì)路徑,interpreter 都會(huì)把文件所在的 directory 加入 sys.path 這個(gè) list 中,Python 就是在 sys.path 中查找包和模塊的,sys.path 中的內(nèi)容本身又是又 Python 的環(huán)境變量決定。
code-1
#test.pyimport osimport sysprint sys.path[0]# executepython test.pypython /Users/x/workspace/blog-code/p2016_05_28_python_path_find/test.py
執(zhí)行表明相對(duì)路徑和絕對(duì)路徑都輸出相同的結(jié)果,而且無(wú)論哪種執(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.pyimport osfrom redis import Redis#execute test2.pyTraceback (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 RedisImportError: 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__ 就是該模塊的路徑名 主站蜘蛛池模板: 沙田区| 临夏市| 荔浦县| 滨海县| 竹溪县| 宁阳县| 永和县| 古交市| 阳高县| 新化县| 土默特右旗| 罗田县| 明溪县| 方山县| 海宁市| 太谷县| 宾阳县| 迁安市| 正宁县| 晋中市| 阜康市| 晋州市| 大名县| 澜沧| 莎车县| 高台县| 民乐县| 阜宁县| 奇台县| 启东市| 香港 | 荆州市| 怀化市| 定远县| 卢氏县| 东乡| 吉木乃县| 斗六市| 页游| 陕西省| 金溪县|