本篇內(nèi)容主要講解“Python中怎么實(shí)現(xiàn)自動導(dǎo)入缺失的庫”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python中怎么實(shí)現(xiàn)自動導(dǎo)入缺失的庫”吧!
目前創(chuàng)新互聯(lián)已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計、大同網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。在寫 Python 項(xiàng)目的時候,我們可能經(jīng)常會遇到導(dǎo)入模塊失敗的錯誤:ImportError: No module named 'xxx' 或者 ModuleNotFoundError: No module named 'xxx' 。
導(dǎo)入失敗問題,通常分為兩種:一種是導(dǎo)入自己寫的模塊(即以 .py 為后綴的文件),另一種是導(dǎo)入三方庫。本文主要討論第二種情況,今后有機(jī)會,我們再詳細(xì)討論其它的相關(guān)話題。
解決導(dǎo)入 Python 庫失敗的問題,其實(shí)關(guān)鍵是在運(yùn)行環(huán)境中裝上缺失的庫(注意是否是虛擬環(huán)境),或者使用恰當(dāng)?shù)奶娲桨浮_@個問題又分為三種情況:
一、單個模塊中缺失的庫
在編寫代碼的時候,如果我們需要使用某個三方庫(如 requests),但不確定實(shí)際運(yùn)行的環(huán)境是否裝了它,那么可以這樣寫:
這樣寫的效果是,如果找不到 requests 庫,就先安裝,再導(dǎo)入。
在某些開源項(xiàng)目中,我們可能還會看到如下的寫法(以 json 為例):
這樣寫的效果是,優(yōu)先導(dǎo)入三方庫 simplejson,如果找不到,那就使用內(nèi)置的標(biāo)準(zhǔn)庫 json。
這種寫法的好處是不需要導(dǎo)入額外的庫,但它有個缺點(diǎn),即需要保證那兩個庫在使用上是兼容的,如果在標(biāo)準(zhǔn)庫中找不到替代的庫,那就不可行了。
如果真找不到兼容的標(biāo)準(zhǔn)庫,也可以自己寫一個模塊(如 my_json.py),實(shí)現(xiàn)想要的東西,然后在 except 語句中再導(dǎo)入它。
二、整個項(xiàng)目中缺失的庫
以上的思路是針對開發(fā)中的項(xiàng)目,但是它有幾個不足:1、在代碼中對每個可能缺失的三方庫都 pip install,并不可取;2、某個三方庫無法被標(biāo)準(zhǔn)庫或自己手寫的庫替代,該怎么辦?3、已成型的項(xiàng)目,不允許做這些修改怎么辦?
所以這里的問題是:有一個項(xiàng)目,想要部署到新的機(jī)器上,它涉及很多三方庫,但是機(jī)器上都沒有預(yù)裝,該怎么辦?
對于一個合規(guī)的項(xiàng)目,按照約定,通常它會包含一個“requirements.txt ”文件,記錄了該項(xiàng)目的所有依賴庫及其所需的版本號。這是在項(xiàng)目發(fā)布前,使用命令pip freeze > requirements.txt 生成的。
使用命令pip install -r requirements.txt (在該文件所在目錄執(zhí)行,或在命令中寫全文件的路徑),就能自動把所有的依賴庫給裝上。
但是,如果項(xiàng)目不合規(guī),或者由于其它倒霉的原因,我們沒有這樣的文件,又該如何是好?
一個笨方法就是,把項(xiàng)目跑起來,等它出錯,遇到一個導(dǎo)庫失敗,就手動裝一個,然后再跑一遍項(xiàng)目,遇到導(dǎo)庫失敗就裝一下,如此循環(huán)……(此處省略 1 萬句臟話)……
三、自動導(dǎo)入任意缺失的庫
有沒有一種更好的可以自動導(dǎo)入缺失的庫的方法呢?
在不修改原有的代碼的情況下,在不需要“requirements.txt”文件的情況下,有沒有辦法自動導(dǎo)入所需要的庫呢?
當(dāng)然有!先看看效果:
我們以 tornado 為例,第一步操作可看出,我們沒有裝過 tornado,經(jīng)過第二步操作后,再次導(dǎo)入 tornado 時,程序會幫我們自動下載并安裝好 tornado,所以不再報錯。
autoinstall 是我們手寫的模塊,代碼如下:
這段代碼中使用了sys.meta_path ,我們先打印一下,看看它是個什么東西?
Python 3 的 import 機(jī)制在查找過程中,大致順序如下:
在 sys.modules 中查找,它緩存了所有已導(dǎo)入的模塊
在 sys.meta_path 中查找,它支持自定義的加載器
在 sys.path 中查找,它記錄了一些庫所在的目錄名
若未找到,則拋出 ImportError 異常
其中要注意,sys.meta_path 在不同的 Python 版本中有所差異,比如它在 Python 2 與 Python 3 中差異很大;在較新的 Python 3 版本(3.4+)中,自定義的加載器需要實(shí)現(xiàn)find_spec 方法,而早期的版本用的則是find_module 。
以上代碼是一個自定義的類庫加載器 AutoInstall,可以實(shí)現(xiàn)自動導(dǎo)入三方庫的目的。需要說明一下,這種方法會“劫持”所有新導(dǎo)入的庫,破壞原有的導(dǎo)入方式,因此也可能出現(xiàn)一些奇奇怪怪的問題,敬請留意。
sys.meta_path 屬于 Python 探針的一種運(yùn)用。探針,即import hook,是 Python 幾乎不受人關(guān)注的機(jī)制,但它可以做很多事,例如加載網(wǎng)絡(luò)上的庫、在導(dǎo)入模塊時對模塊進(jìn)行修改、自動安裝缺失庫、上傳審計信息、延遲加載等等。
到此,相信大家對“Python中怎么實(shí)現(xiàn)自動導(dǎo)入缺失的庫”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!