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

Python中標(biāo)準(zhǔn)模塊importlib詳解

 更新時間:2017年04月16日 09:52:58   作者:老頑童2007  
這篇文章主要給大家詳細(xì)介紹了Python中標(biāo)準(zhǔn)模塊importlib的使用方法和示例,非常簡單,有需要的小伙伴可以參考下

1 模塊簡介

Python提供了importlib包作為標(biāo)準(zhǔn)庫的一部分。目的就是提供Python中import語句的實現(xiàn)(以及__import__函數(shù))。另外,importlib允許程序員創(chuàng)建他們自定義的對象,可用于引入過程(也稱為importer)。

什么是imp?

另外有一個叫做imp的模塊,它提供給Python import語句機制的接口。這個模塊在Python 3.4中被否決,目的就是為了只使用importlib。

這個模塊有些復(fù)雜,因此我們在這篇博文中主要討論以下幾個主題:

•動態(tài)引入
•檢查模塊是否可以被引入
•引入源文件自身
•第三方模塊 import_from_github_com

2 模塊使用

2.1 動態(tài)引入

importlib模塊支持傳入字符串來引入一個模塊。我們創(chuàng)建兩個簡單的模塊來驗證這個功能。我們將會給予兩個模塊相同的接口,讓它們打印名字以便我們能夠區(qū)分它們。創(chuàng)建兩個模塊,分別為foo.py和bar.py,代碼如下所示,

def main():
 print(__name__)

現(xiàn)在我們使用importlib來引入它們。讓我們看看這段代碼如何去做的。確保你已經(jīng)把這段代碼放在與上面創(chuàng)建的兩個模塊相同的目錄下。

#importer.py
import importlib

def dynamic_import(module):
 return importlib.import_module(module)

if __name__ == "__main__":
 module = dynamic_import('foo')
 module.main()

 module_two = dynamic_import('bar')
 module_two()

在這段代碼中,我們手動引入importlib模塊,并創(chuàng)建一個簡單的函數(shù)dynamic_import。這個函數(shù)所做的就是調(diào)用importlib模塊中的import_module函數(shù),入?yún)⒕褪俏覀儌魅氲淖址?,然后返回調(diào)用結(jié)果。在代碼段的下面,我們調(diào)用每個模塊的main方法,將會打印出每個模塊的名稱。

在你的代碼中,你可能不會大量這樣做。當(dāng)你只有一個字符串時,如果你想引入這個模塊,importlib就允許你可以這么做。

2.2 模塊引入檢查

Python有一個編碼規(guī)范就是EAPP:Easier to ask for forgiveness than permision。意思就是經(jīng)常假設(shè)一些事情是存在的(例如,key在詞典中),如果出錯了,那么就捕獲異常。你可以看 Python標(biāo)準(zhǔn)模塊--import 文章中我們嘗試引入模塊,當(dāng)它不存在時,我們就會捕獲到ImportError。如果我們想檢查并觀察一個模塊是否可以引入而不是僅僅是猜測,該如何去做?你可以使用importlib。代碼如下:

#coding:utf-8

import importlib.util
import importlib

def check_module(module_name):
 module_spec = importlib.util.find_spec(module_name)
 if module_spec is None:
 print("Module :{} not found".format(module_name))
 return None
 else:
 print("Module:{} can be imported!".format(module_name))
 return module_spec
 
def import_module_from_spec(module_spec):
 module = importlib.util.module_from_spec(module_spec)
 module_spec.loader.exec_module(module)
 return module

if __name__ == "__main__":
 module_spec = check_module("fake_module")
 module_spec = check_module("collections")
 if(module_spec):
 module = import_module_from_spec(module_spec)
 print(dir(module))

這里我們引入importlib模塊的子模塊util。在check_module函數(shù)中,我們調(diào)用find_spec函數(shù)來檢查傳入的字符串作為模塊是否存在。首先,我們傳入一個假的名稱,然后我們傳入一個Python模塊的真實名稱。如果你運行這段代碼,你將會看到你傳入一個沒有安裝的模塊的名稱,find_spec函數(shù)將會返回None,我們的代碼將會打印出這個模塊沒有找到。如果找到了,我們就會返回模塊的說明。

我們可以獲取到模塊的說明,然后使用它來真正的引入模塊。或者你可以將字符串傳入到import_module函數(shù)中,正如我們在2.1節(jié)中所學(xué)習(xí)到的一樣。但是我們已經(jīng)學(xué)習(xí)到如何使用模塊的說明。讓我們看一下上述代碼中的import_module_from_spec函數(shù)。它接受由check_module函數(shù)返回的模塊說明。我們將其傳入到module_from_spec函數(shù),它將會返回引入的模塊。Python的官方文檔推薦,在引入模塊后執(zhí)行它,所以我們下一步做的就是調(diào)用exec_module函數(shù)。最后我們返回這個模塊,并且運行Python的dir函數(shù)來確認(rèn)這個我們就是我們所期望的。

2.3 從源文件中引入

在這一節(jié)中,我想說明importlib的子模塊util還有另外一個技巧。你可以使用util通過模塊名和文件路徑來引入一個模塊。示例如下所示,

#coding:utf-8

import importlib.util

def import_source(module_name):
 module_file_path = module_name.__file__
 module_name = module_name.__name__
 
 module_spec = importlib.util.spec_from_file_location(module_name,module_file_path)
 module = importlib.util.module_from_spec(module_spec)
 module_spec.loader.exec_module(module)
 print(dir(module))

 msg = "The {module_name} module has the following methods:{methods}"
 print(msg.format(module_name = module_name,methods = dir(module)))
 
if __name__ == "__main__":
 import logging
 import_source(logging)

上述代碼中,我們實際引入了logging模塊,并將它傳入到import_source函數(shù)。在這個函數(shù)中,我們首先獲取到模塊的實際路徑和名稱。然后我們將這些信息傳入到util的spec_from_file_location函數(shù)中,這個將會返回模塊的說明。一旦我們獲取到模塊的說明,我們就可以使用與2.2節(jié)相同的importlib機制來實際引入模塊。

現(xiàn)在讓我們來看一個精巧的第三方庫,Python的__import__()函數(shù)直接引入github中的包。

2.4 import_from_github_com

這個精巧的包叫做import_from_github_com,它可以用于發(fā)現(xiàn)和下載github上的包。為了安裝他,你需要做的就是按照如下命令使用pip,

pip install import_from_github_com

這個包使用了PEP 302中新的引入鉤子,允許你可以從github上引入包。這個包實際做的就是安裝這個包并將它添加到本地。你需要Python 3.2或者更高的版本,git和pip才能使用這個包。

一旦這些已經(jīng)安裝,你可以在Python shell中輸入如下命令,

>>> from github_com.zzzeek import sqlalchemy
Collecting git+https://github.com/zzzeek/sqlalchemy
Cloning https://github.com/zzzeek/sqlalchemy to /tmp/pip-acfv7t06-build
Installing collected packages: SQLAlchemy
Running setup.py install for SQLAlchemy ... done
Successfully installed SQLAlchemy-1.1.0b1.dev0
>>> locals()
{'__builtins__': <module 'builtins' (built-in)>, '__spec__': None,
'__package__': None, '__doc__': None, '__name__': '__main__',
'sqlalchemy': <module 'sqlalchemy' from '/usr/local/lib/python3.5/site-packages/\
sqlalchemy/__init__.py'>,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>}

你如果看了import_from_github_com的源碼,你將會注意到它并沒有使用importlib。實際上,它使用了pip來安裝那些沒有安裝的包,然后使用Python的__import__()函數(shù)來引入新安裝的模塊。這段代碼非常值得學(xué)習(xí)。

2.5 總結(jié)

到這里,你已經(jīng)了解到在你的代碼中如何使用importlib和引入鉤子。當(dāng)然還有很多超出本文所覆蓋的知識,如果你需要寫一個自定義的引入器或者下載器,你需要花費很多時間來閱讀官方文檔和源碼。

相關(guān)文章

  • 淺談windows環(huán)境下pytorch安裝踩坑

    淺談windows環(huán)境下pytorch安裝踩坑

    本文主要介紹了在Windows環(huán)境下使用Anaconda創(chuàng)建Python環(huán)境并安裝Pytorch的過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Python報錯AssertionError:can only test a child proc問題

    Python報錯AssertionError:can only test a c

    這篇文章主要介紹了Python報錯AssertionError:can only test a child proc問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 利用Python繪制一個可愛的米老鼠

    利用Python繪制一個可愛的米老鼠

    turtle庫是一個點線面的簡單圖像庫,在Python2.6之后被引入進來,能夠完成一些比較簡單的幾何圖像可視化。本文將利用turtle繪制一個可愛的米老鼠,感興趣的可以試一試
    2022-03-03
  • Numpy中的數(shù)組搜索中np.where方法詳細(xì)介紹

    Numpy中的數(shù)組搜索中np.where方法詳細(xì)介紹

    這篇文章主要介紹了Numpy中的數(shù)組搜索中np.where方法詳細(xì)介紹,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python實現(xiàn)計算信息熵的示例代碼

    Python實現(xiàn)計算信息熵的示例代碼

    信息熵(information?entropy)是信息論的基本概念。描述信息源各可能事件發(fā)生的不確定性。本文將通過Python實現(xiàn)信息熵的計算,感興趣的可以了解一下
    2022-12-12
  • Python輕松實現(xiàn)PDF頁面的自動化旋轉(zhuǎn)

    Python輕松實現(xiàn)PDF頁面的自動化旋轉(zhuǎn)

    本文將深入探討如何利用Python,通過一個功能豐富的庫,輕松實現(xiàn)PDF頁面的自動化旋轉(zhuǎn),讓你徹底告別手動調(diào)整的繁瑣,大幅提升工作效率,希望對大家有所幫助
    2026-01-01
  • Python3中類、模塊、錯誤與異常、文件的簡易教程

    Python3中類、模塊、錯誤與異常、文件的簡易教程

    這篇文章主要給大家介紹了關(guān)于Python3中類、模塊、錯誤與異常、文件的相關(guān)教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 使用Python的pencolor函數(shù)實現(xiàn)漸變色功能

    使用Python的pencolor函數(shù)實現(xiàn)漸變色功能

    這篇文章主要介紹了使用Python的pencolor函數(shù)實現(xiàn)漸變色功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • opencv3/C++實現(xiàn)視頻背景去除建模(BSM)

    opencv3/C++實現(xiàn)視頻背景去除建模(BSM)

    今天小編就為大家分享一篇opencv3/C++實現(xiàn)視頻背景去除建模(BSM),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python中str.format()詳解

    Python中str.format()詳解

    本文主要給大家詳細(xì)介紹的是python編程中str.format()的基本語法和高級用法,非常的詳細(xì),并附有示例,希望大家能夠喜歡
    2017-03-03

最新評論

万源市| 新疆| 于都县| 乐亭县| 涟源市| 小金县| 连山| 凤翔县| 旬邑县| 龙陵县| 门源| 梅州市| 洛阳市| 泗洪县| 车致| 夏河县| 芦山县| 化德县| 佛学| 寿光市| SHOW| 天全县| 临漳县| 康定县| 兰西县| 湟中县| 额济纳旗| 高阳县| 大新县| 石景山区| 宜州市| 射阳县| 八宿县| 萍乡市| 景泰县| 曲阜市| 四川省| 包头市| 九江市| 鲁山县| 夏津县|