国产日韩欧美一区二区三区综合,日本黄色免费在线,国产精品麻豆欧美日韩ww,色综合狠狠操

極客小將

您現(xiàn)在的位置是:首頁 » python編程資訊

資訊內(nèi)容

學(xué)習(xí)在python中實(shí)現(xiàn)自動(dòng)導(dǎo)入缺失的庫

極客小將2021-01-04-
簡介python教程欄目介紹實(shí)現(xiàn)自動(dòng)導(dǎo)入缺失的庫。導(dǎo)入失敗問題,通常分為兩種:一種是導(dǎo)入自己寫的模塊(即以.py為后綴的文件),另一種是導(dǎo)入三方庫。本文主要討論第二種情況,今后有機(jī)會(huì),我們?cè)僭敿?xì)討論其它的相關(guān)話題。解決導(dǎo)入Python庫失敗的問題,其實(shí)關(guān)鍵是在運(yùn)行環(huán)境中裝上缺失的庫(注意是否是虛擬環(huán)境)
歡迎訪問少兒編程網(wǎng)(http://www.pxcodes.com) python教程欄目介紹實(shí)現(xiàn)自動(dòng)導(dǎo)入缺失的庫。

ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

導(dǎo)入失敗問題,通常分為兩種:一種是導(dǎo)入自己寫的模塊(即以 .py 為后綴的文件),另一種是導(dǎo)入三方庫。本文主要討論第二種情況,今后有機(jī)會(huì),我們?cè)僭敿?xì)討論其它的相關(guān)話題。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

解決導(dǎo)入 Python庫失敗的問題,其實(shí)關(guān)鍵是在運(yùn)行環(huán)境中裝上缺失的庫(注意是否是虛擬環(huán)境),或者使用恰當(dāng)?shù)奶娲桨浮_@個(gè)問題又分為三種情況:ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

一、單個(gè)模塊中缺失的庫

在編寫代碼的時(shí)候,如果我們需要使用某個(gè)三方庫(如 requests),但不確定實(shí)際運(yùn)行的環(huán)境是否裝了它,那么可以這樣:ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

try: import requestsexcept ImportError: import os os.system('pip install requests') import requests復(fù)制代碼

這樣寫的效果是,如果找不到 requests 庫,就先安裝,再導(dǎo)入。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

在某些開源項(xiàng)目中,我們可能還會(huì)看到如下的寫法(以 json 為例):ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

ry: import simplejson as jsonexcept ImportError: import json復(fù)制代碼

這樣寫的效果是,優(yōu)先導(dǎo)入三方庫simplejson,如果找不到,那就使用內(nèi)置的標(biāo)準(zhǔn)庫 json。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

這種寫法的好處是不需要導(dǎo)入額外的庫,但它有個(gè)缺點(diǎn),即需要保證那兩個(gè)庫在使用上是兼容的,如果在標(biāo)準(zhǔn)庫中找不到替代的庫,那就不可行了。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

如果真找不到兼容的標(biāo)準(zhǔn)庫,也可以自己寫一個(gè)模塊(如 my_json.py),實(shí)現(xiàn)想要的東西,然后在except語句中導(dǎo)入它。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

ry: import simplejson as jsonexcept ImportError: import my_json as json復(fù)制代碼

碼字不易廢話兩句:有需要學(xué)習(xí)資料的或者有技術(shù)問題交流“點(diǎn)擊”即可ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

二、整個(gè)項(xiàng)目中缺失的庫

以上的思路是針對(duì)開發(fā)中的項(xiàng)目,但是它有幾個(gè)不足:ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

1、在代碼中對(duì)每個(gè)可能缺失的三方庫都 pip install,并不可取;ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

2、某個(gè)三方庫無法被標(biāo)準(zhǔn)庫或自己手寫的庫替代,該怎么辦?ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

3、已成型的項(xiàng)目,不允許做這些修改怎么辦?ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

所以這里的問題是:有一個(gè)項(xiàng)目,想要部署到新的機(jī)器上,它涉及很多三方庫,但是機(jī)器上都沒有預(yù)裝,該怎么辦?ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

對(duì)于一個(gè)合規(guī)的項(xiàng)目,按照約定,通常它會(huì)包含一個(gè)“requirements.txt ”文件,記錄了該項(xiàng)目的所有依賴庫及其所需的版本號(hào)。這是在項(xiàng)目發(fā)布前,使用命令pip freeze > requirements.txt 生成的。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

使用命令pip install -r requirements.txt (在該文件所在目錄執(zhí)行,或在命令中寫全文件的路徑),就能自動(dòng)把所有的依賴庫給裝上。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

但是,如果項(xiàng)目不合規(guī),或者由于其它倒霉的原因,我們沒有這樣的文件,又該如何是好?ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

一個(gè)笨方法就是,把項(xiàng)目跑起來,等它出錯(cuò),遇到一個(gè)導(dǎo)庫失敗,就手動(dòng)裝一個(gè),然后再跑一遍項(xiàng)目,遇到導(dǎo)庫失敗就裝一下,如此循環(huán)……ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

三、自動(dòng)導(dǎo)入任意缺失的庫

有沒有一種更好的可以自動(dòng)導(dǎo)入缺失的庫的方法呢?ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

在不修改原有的代碼的情況下,在不需要“requirements.txt”文件的情況下,有沒有辦法自動(dòng)導(dǎo)入所需要的庫呢?ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

當(dāng)然有!先看看效果:ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

我們以tornado 為例,第一步操作可看出,我們沒有裝過 tornado,經(jīng)過第二步操作后,再次導(dǎo)入 tornado 時(shí),程序會(huì)幫我們自動(dòng)下載并安裝好 tornado,所以不再報(bào)錯(cuò)。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

autoinstall 是我們手寫的模塊,代碼如下:ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

# 以下代碼在 python 3.6.1 版本驗(yàn)證通過import sysimport osfrom importlib import import_moduleclass AutoInstall(): _loaded = set() @classmethod def find_spec(cls, name, path, target=None): if path is None and name not in cls._loaded: cls._loaded.add(name) print("Installing", name) try: result = os.system('pip install {}'.format(name)) if result == 0: return import_module(name) except Exception as e: print("Failed", e) return Nonesys.meta_path.append(AutoInstall)復(fù)制代碼

這段代碼中使用了sys.meta_path ,我們先打印一下,看看它是個(gè)什么東西?ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

Python 3的 import 機(jī)制在查找過程中,大致順序如下:ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

在 sys.modules 中查找,它緩存了所有已導(dǎo)入的模塊ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

在 sys.meta_path中查找,它支持自定義的加載器ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

在 sys.path 中查找,它記錄了一些庫所在的目錄名ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

若未找到,拋出ImportError異常ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

其中要注意,sys.meta_path 在不同的Python版本中有所差異,比如它在Python 2 與 Python 3 中差異很大;在較新的 Python 3 版本(3.4+)中,自定義的加載器需要實(shí)現(xiàn)find_spec方法,而早期的版本用的則是find_module。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

以上代碼是一個(gè)自定義的類庫加載器 AutoInstall,可以實(shí)現(xiàn)自動(dòng)導(dǎo)入三方庫的目的。需要說明一下,這種方法會(huì)“劫持”所有新導(dǎo)入的庫,破壞原有的導(dǎo)入方式,因此也可能出現(xiàn)一些奇奇怪怪的問題,敬請(qǐng)留意。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

sys.meta_path 屬于 Python 探針的一種運(yùn)用。探針,即import hook,是 Python 幾乎不受人關(guān)注的機(jī)制,但它可以做很多事,例如加載網(wǎng)絡(luò)上的庫、在導(dǎo)入模塊時(shí)對(duì)模塊進(jìn)行修改、自動(dòng)安裝缺失庫、上傳審計(jì)信息、延遲加載等等。ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

限于篇幅,我們不再詳細(xì)展開了。**后小結(jié)一下:ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

可以用 try…except 方式,實(shí)現(xiàn)簡單的三方庫導(dǎo)入或者替換ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

已知全部缺失的依賴庫時(shí)(如 requirements.txt),可以手動(dòng)安裝ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

利用 sys.meta_path,可以自動(dòng)導(dǎo)入任意的缺失庫ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

相關(guān)免費(fèi)學(xué)習(xí)推薦:python教程(視頻)ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

以上就是學(xué)習(xí)在python中實(shí)現(xiàn)自動(dòng)導(dǎo)入缺失的庫的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注少兒編程網(wǎng)其它相關(guān)文章!ekR少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

預(yù)約試聽課

已有385人預(yù)約都是免費(fèi)的,你也試試吧...

主站蜘蛛池模板: 武穴市| 丰都县| 东安县| 德兴市| 长治县| 玛沁县| 南召县| 怀远县| 南部县| 铅山县| 沙雅县| 隆德县| 密山市| 威信县| 勃利县| 南和县| 蓬溪县| 和顺县| 资源县| 元谋县| 太白县| 那曲县| 阳山县| 集安市| 海城市| 米易县| 南康市| 桦甸市| 铜川市| 恩平市| 高清| 金坛市| 金平| 佛冈县| 修文县| 理塘县| 郓城县| 柳州市| 绥阳县| 南宁市| 涡阳县|