日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python缺少标准库_Python 实现自动导入缺失的库

發(fā)布時(shí)間:2023/12/10 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python缺少标准库_Python 实现自动导入缺失的库 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:豌豆花下貓

在寫 Python 項(xiàng)目的時(shí)候,我們可能經(jīng)常會(huì)遇到導(dǎo)入模塊失敗的錯(cuò)誤:ImportError: No module named 'xxx'或者M(jìn)oduleNotFoundError: No module named 'xxx'。

導(dǎo)入失敗問(wèn)題,通常分為兩種:一種是導(dǎo)入自己寫的模塊(即以 .py 為后綴的文件),另一種是導(dǎo)入三方庫(kù)。本文主要討論第二種情況,今后有機(jī)會(huì),我們?cè)僭敿?xì)討論其它的相關(guān)話題。

解決導(dǎo)入 Python 庫(kù)失敗的問(wèn)題,其實(shí)關(guān)鍵是在運(yùn)行環(huán)境中裝上缺失的庫(kù)(注意是否是虛擬環(huán)境),或者使用恰當(dāng)?shù)奶娲桨浮_@個(gè)問(wèn)題又分為三種情況:

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

在編寫代碼的時(shí)候,如果我們需要使用某個(gè)三方庫(kù)(如 requests),但不確定實(shí)際運(yùn)行的環(huán)境是否裝了它,那么可以這樣:

try:importrequestsexceptImportError:importos

os.system('pip install requests')import requests

這樣寫的效果是,如果找不到 requests 庫(kù),就先安裝,再導(dǎo)入。

在某些開(kāi)源項(xiàng)目中,我們可能還會(huì)看到如下的寫法(以 json 為例):

try:importsimplejson as jsonexceptImportError:import json

這樣寫的效果是,優(yōu)先導(dǎo)入三方庫(kù) simplejson,如果找不到,那就使用內(nèi)置的標(biāo)準(zhǔn)庫(kù) json。

這種寫法的好處是不需要導(dǎo)入額外的庫(kù),但它有個(gè)缺點(diǎn),即需要保證那兩個(gè)庫(kù)在使用上是兼容的,如果在標(biāo)準(zhǔn)庫(kù)中找不到替代的庫(kù),那就不可行了。

如果真找不到兼容的標(biāo)準(zhǔn)庫(kù),也可以自己寫一個(gè)模塊(如 my_json.py),實(shí)現(xiàn)想要的東西,然后在 except 語(yǔ)句中導(dǎo)入它。

try:importsimplejson as jsonexceptImportError:import my_json as json

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

以上的思路是針對(duì)開(kāi)發(fā)中的項(xiàng)目,但是它有幾個(gè)不足:1、在代碼中對(duì)每個(gè)可能缺失的三方庫(kù)都 pip install,并不可取;2、某個(gè)三方庫(kù)無(wú)法被標(biāo)準(zhǔn)庫(kù)或自己手寫的庫(kù)替代,該怎么辦?3、已成型的項(xiàng)目,不允許做這些修改怎么辦?

所以這里的問(wèn)題是:有一個(gè)項(xiàng)目,想要部署到新的機(jī)器上,它涉及很多三方庫(kù),但是機(jī)器上都沒(méi)有預(yù)裝,該怎么辦?

對(duì)于一個(gè)合規(guī)的項(xiàng)目,按照約定,通常它會(huì)包含一個(gè)“requirements.txt?”文件,記錄了該項(xiàng)目的所有依賴庫(kù)及其所需的版本號(hào)。這是在項(xiàng)目發(fā)布前,使用命令pip freeze > requirements.txt?生成的。

使用命令pip install -r requirements.txt?(在該文件所在目錄執(zhí)行,或在命令中寫全文件的路徑),就能自動(dòng)把所有的依賴庫(kù)給裝上。

但是,如果項(xiàng)目不合規(guī),或者由于其它倒霉的原因,我們沒(méi)有這樣的文件,又該如何是好?

一個(gè)笨方法就是,把項(xiàng)目跑起來(lái),等它出錯(cuò),遇到一個(gè)導(dǎo)庫(kù)失敗,就手動(dòng)裝一個(gè),然后再跑一遍項(xiàng)目,遇到導(dǎo)庫(kù)失敗就裝一下,如此循環(huán)……(此處省略 1 萬(wàn)句臟話)……

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

有沒(méi)有一種更好的可以自動(dòng)導(dǎo)入缺失的庫(kù)的方法呢?

在不修改原有的代碼的情況下,在不需要“requirements.txt”文件的情況下,有沒(méi)有辦法自動(dòng)導(dǎo)入所需要的庫(kù)呢?

當(dāng)然有!先看看效果:

我們以 tornado 為例,第一步操作可看出,我們沒(méi)有裝過(guò) tornado,經(jīng)過(guò)第二步操作后,再次導(dǎo)入 tornado 時(shí),程序會(huì)幫我們自動(dòng)下載并安裝好 tornado,所以不再報(bào)錯(cuò)。

autoinstall 是我們手寫的模塊,代碼如下:

#以下代碼在 python 3.6.1 版本驗(yàn)證通過(guò)

importsysimportosfrom importlib importimport_moduleclassAutoInstall():

_loaded=set()

@classmethoddef find_spec(cls, name, path, target=None):if path is None and name not incls._loaded:

cls._loaded.add(name)print("Installing", name)try:

result= os.system('pip install {}'.format(name))if result ==0:returnimport_module(name)exceptException as e:print("Failed", e)returnNone

sys.meta_path.append(AutoInstall)

這段代碼中使用了sys.meta_path?,我們先打印一下,看看它是個(gè)什么東西?

Python 3 的 import 機(jī)制在查找過(guò)程中,大致順序如下:

在 sys.modules 中查找,它緩存了所有已導(dǎo)入的模塊

在 sys.meta_path 中查找,它支持自定義的加載器

在 sys.path 中查找,它記錄了一些庫(kù)所在的目錄名

若未找到,拋出ImportError異常

其中要注意,sys.meta_path 在不同的 Python 版本中有所差異,比如它在 Python 2 與 Python 3 中差異很大;在較新的 Python 3 版本(3.4+)中,自定義的加載器需要實(shí)現(xiàn)find_spec方法,而早期的版本用的則是find_module。

以上代碼是一個(gè)自定義的類庫(kù)加載器 AutoInstall,可以實(shí)現(xiàn)自動(dòng)導(dǎo)入三方庫(kù)的目的。需要說(shuō)明一下,這種方法會(huì)“劫持”所有新導(dǎo)入的庫(kù),破壞原有的導(dǎo)入方式,因此也可能出現(xiàn)一些奇奇怪怪的問(wèn)題,敬請(qǐng)留意。

sys.meta_path 屬于 Python 探針的一種運(yùn)用。探針,即import hook,是 Python 幾乎不受人關(guān)注的機(jī)制,但它可以做很多事,例如加載網(wǎng)絡(luò)上的庫(kù)、在導(dǎo)入模塊時(shí)對(duì)模塊進(jìn)行修改、自動(dòng)安裝缺失庫(kù)、上傳審計(jì)信息、延遲加載等等。

限于篇幅,我們不再詳細(xì)展開(kāi)了。最后小結(jié)一下:

可以用 try…except 方式,實(shí)現(xiàn)簡(jiǎn)單的三方庫(kù)導(dǎo)入或者替換

已知全部缺失的依賴庫(kù)時(shí)(如 requirements.txt),可以手動(dòng)安裝

利用 sys.meta_path,可以自動(dòng)導(dǎo)入任意的缺失庫(kù)

參考資料:

https://github.com/liuchang0812/slides/tree/master/pycon2015cn

http://blog.konghy.cn/2016/10/25/python-import-hook

https://docs.python.org/3/library/sys.html#sys.meta_path

總結(jié)

以上是生活随笔為你收集整理的python缺少标准库_Python 实现自动导入缺失的库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。