最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中模塊查找的原理與方法詳解

 更新時間:2017年08月11日 08:26:08   作者:三月沙  
這篇文章主要給大家介紹了python中模塊查找的原理與方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考學(xué)習價值,需要的朋友們下面跟著小編來一起學(xué)習學(xué)習吧。

前言

本文主要給大家介紹了關(guān)于python模塊查找的原理與方式,分享出來供大家參考學(xué)習,下面話不多說,來一起看看詳細的介紹:

基礎(chǔ)概念

module

模塊, 一個 py 文件或以其他文件形式存在的可被導(dǎo)入的就是一個模塊

package

包,包含有 __init__ 文件的文件夾

relative path

相對路徑,相對于某個目錄的路徑

absolute path

絕對路徑,全路徑

路徑查找

python 解釋器查找被引入的包或模塊

Python 解釋器是如何查找包和模塊的

Python 執(zhí)行一個 py 文件,無論執(zhí)行的方式是用絕對路徑還是相對路徑,interpreter 都會把文件所在的 directory 加入 sys.path 這個 list 中,Python 就是在 sys.path 中查找包和模塊的,sys.path 中的內(nèi)容本身又是又 Python 的環(huán)境變量決定。

code-1

#test.py
import os
import sys
print sys.path[0]
# execute
python test.py
python /Users/x/workspace/blog-code/p2016_05_28_python_path_find/test.py

執(zhí)行表明相對路徑和絕對路徑都輸出相同的結(jié)果,而且無論哪種執(zhí)行方式,test.py 所在的文件夾都會被加入 sys.path 的首位,也就是索引為0的位置。

Python 解釋器查找包的順序是什么

解釋器查找包,首先搜索 built-in module,其次搜索 sys.path ,這樣的查找順序?qū)?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 模塊,可以證實 built-in module 不會被遮蔽,而 redis 屬于第三方模塊,默認安裝位置是 Python 環(huán)境變量中的 site-packages,解釋器啟動之后會將此目錄中的內(nèi)容加入 sys.path,由于當前目錄會在 sys.path 的首位,當前目錄的 redis 優(yōu)先被找到,site-packages 中的 redis 模塊被遮蔽了。

交互式執(zhí)行環(huán)境的查找順序

進入交互式執(zhí)行環(huán)境,解釋器會自動把當前目錄加入 sys.path, 這時當前目錄是以相對路徑的形式出現(xiàn)在 sys.path 中:

>>> import os.path
>>> import sys
>>> os.path.abspath(sys.path[0])
'/Users/x/workspace/blog-code'
>>>

除此之外,其他與執(zhí)行一個文件是相同的。

模塊中的 __file__ 變量

__file__ is the pathname of the file from which the module was loaded, if it was loaded from a file. 如果一個模塊是從文件加載的,__file__ 就是該模塊的路徑名–Python Doc:

顧名思義,當模塊以文件的形式出現(xiàn) __file__ 指的是模塊文件的路徑名,以相對路徑執(zhí)行 __file__ 是相對路徑,以絕對路徑執(zhí)行 __file__ 是絕對路徑。

#test3.py
print __file__
#相對路徑執(zhí)行
python test3.py
test3.py
#絕對路徑執(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__ 每次都能準確得到模塊的正確位置,最好對其再取一次絕對路徑 os.path.abspath(__file__) 。

交互式 shell 中的 __file__

>>> __file__
Traceback (most recent call last):
 File "<input>", line 1, in <module>
NameError: name '__file__' is not defined

這是因為當前交互式shell的執(zhí)行并不是以文件的形式加載,所以不存在__file__ 這樣的屬性。

sys.argv[0] 變量

sys.argv[0] 是它用來獲取主入口執(zhí)行文件。

#test.py
import sys
print __file__
print sys.argv[0]

以上 print 輸出相同的結(jié)果,因為主執(zhí)行文件和__file__所屬的模塊是同一個,當我們改變?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 會把這個模塊加入 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 解釋器啟動之后,會把預(yù)先載入 built-in module,可以通過 sys.modules 驗證。

>>> sys.modules['os']
<module 'os' from '/Users/x/python_dev/lib/python2.7/os.pyc'>
>>>

借助 sys.modules 和 __file__,可以動態(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)先級>同目錄>sys.path,Python 中的特有屬性 __file__ 以及 sys.argv[0] ,sys.modules 都能幫助我們理解包的查找和導(dǎo)入概念,只要能正確理解 sys.path 的作用和行為,理解包的查找就不是難題了。

文中所有代碼見:github

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 基于Python計算圓周率pi代碼實例

    基于Python計算圓周率pi代碼實例

    這篇文章主要介紹了基于Python計算圓周率pi代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-03-03
  • python中常見的運算符及用法實例

    python中常見的運算符及用法實例

    運算符用于執(zhí)行程序代碼運算,會針對一個以上操作數(shù)項目來進行運算,下面這篇文章主要給大家介紹了關(guān)于python中常見的運算符及用法的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Python使用pptx實現(xiàn)復(fù)制頁面到其他PPT中

    Python使用pptx實現(xiàn)復(fù)制頁面到其他PPT中

    這篇文章主要為大家詳細介紹了python如何使用pptx庫實現(xiàn)從一個ppt復(fù)制頁面到另一個ppt里面,文中的示例代碼講解詳細,感興趣的可以嘗試一下
    2023-02-02
  • Python使用Supervisor來管理進程的方法

    Python使用Supervisor來管理進程的方法

    這篇文章主要介紹了Python使用Supervisor來管理進程的方法,涉及Supervisor的相關(guān)使用技巧,需要的朋友可以參考下
    2015-05-05
  • 基于Python開發(fā)PPTX壓縮工具

    基于Python開發(fā)PPTX壓縮工具

    在日常辦公中,PPT文件往往因為圖片過大而導(dǎo)致文件體積過大,不便于傳輸和存儲,所以本文將使用Python開發(fā)一個PPTX壓縮工具,需要的可以了解下
    2025-02-02
  • 基于并發(fā)服務(wù)器幾種實現(xiàn)方法(總結(jié))

    基于并發(fā)服務(wù)器幾種實現(xiàn)方法(總結(jié))

    下面小編就為大家分享一篇基于并發(fā)服務(wù)器幾種實現(xiàn)方法(總結(jié)),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Python常見文件操作的函數(shù)示例代碼

    Python常見文件操作的函數(shù)示例代碼

    Python常見文件操作的函數(shù)示例代碼,學(xué)習python的朋友可以參考下。
    2011-11-11
  • 20行代碼教你用python給證件照換底色的方法示例

    20行代碼教你用python給證件照換底色的方法示例

    這篇文章主要介紹了20行代碼教你用python給證件照換底色的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2021-02-02
  • Django各種緩存的配置小結(jié) ?

    Django各種緩存的配置小結(jié) ?

    本文主要介紹了Django各種緩存的配置小結(jié) ,Django提供了多種緩存后端,如內(nèi)存緩存、文件緩存、數(shù)據(jù)庫緩存、Memcached和Redis等,根據(jù)項目需求選擇合適的緩存后端,下面就一起來了解一下吧
    2023-08-08
  • Python內(nèi)建模塊collections實現(xiàn)特殊容器數(shù)據(jù)類型

    Python內(nèi)建模塊collections實現(xiàn)特殊容器數(shù)據(jù)類型

    collections模塊是Python的內(nèi)建模塊之一,它實現(xiàn)了特殊的容器數(shù)據(jù)類型,提供了Python內(nèi)建的數(shù)據(jù)類型dict、list、set、和tuple的高效替代選擇
    2023-06-06

最新評論

连南| 桂林市| 绥棱县| 鄂伦春自治旗| 靖西县| 新龙县| 灯塔市| 庄河市| 绍兴县| 阳朔县| 眉山市| 邵武市| 梅河口市| 广昌县| 密山市| 大理市| 开远市| 桓台县| 固阳县| 大邑县| 天祝| 夹江县| 富川| 福泉市| 唐山市| 金华市| 永泰县| 青铜峡市| 奈曼旗| 上栗县| 六枝特区| 平谷区| 广南县| 乐至县| 思南县| 镇远县| 丹巴县| 大英县| 申扎县| 襄樊市| 肥城市|