竹内纱里奈和大战黑人_欧美成人黄色小视频_91福利影视_欧美在线观看视频网站_h色网站免费观看_97综合

極客小將

您現在的位置是:首頁 » python編程資訊

資訊內容

學習在python中實現自動導入缺失的庫

極客小將2021-01-04-
簡介python教程欄目介紹實現自動導入缺失的庫。導入失敗問題,通常分為兩種:一種是導入自己寫的模塊(即以.py為后綴的文件),另一種是導入三方庫。本文主要討論第二種情況,今后有機會,我們再詳細討論其它的相關話題。解決導入Python庫失敗的問題,其實關鍵是在運行環境中裝上缺失的庫(注意是否是虛擬環境)
歡迎訪問少兒編程網(http://www.pxcodes.com) python教程欄目介紹實現自動導入缺失的庫。

ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

導入失敗問題,通常分為兩種:一種是導入自己寫的模塊(即以 .py 為后綴的文件),另一種是導入三方庫。本文主要討論第二種情況,今后有機會,我們再詳細討論其它的相關話題。ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

解決導入 Python庫失敗的問題,其實關鍵是在運行環境中裝上缺失的庫(注意是否是虛擬環境),或者使用恰當的替代方案。這個問題又分為三種情況:ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

一、單個模塊中缺失的庫

在編寫代碼的時候,如果我們需要使用某個三方庫(如 requests),但不確定實際運行的環境是否裝了它,那么可以這樣:ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

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

這樣寫的效果是,如果找不到 requests 庫,就先安裝,再導入。ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

在某些開源項目中,我們可能還會看到如下的寫法(以 json 為例):ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

ry: import simplejson as jsonexcept ImportError: import json復制代碼

這樣寫的效果是,優先導入三方庫simplejson,如果找不到,那就使用內置的標準庫 json。ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

這種寫法的好處是不需要導入額外的庫,但它有個缺點,即需要保證那兩個庫在使用上是兼容的,如果在標準庫中找不到替代的庫,那就不可行了。ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

如果真找不到兼容的標準庫,也可以自己寫一個模塊(如 my_json.py),實現想要的東西,然后在except語句中導入它。ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

ry: import simplejson as jsonexcept ImportError: import my_json as json復制代碼

碼字不易廢話兩句:有需要學習資料的或者有技術問題交流“點擊”即可ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

二、整個項目中缺失的庫

以上的思路是針對開發中的項目,但是它有幾個不足:ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

1、在代碼中對每個可能缺失的三方庫都 pip install,并不可取;ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

2、某個三方庫無法被標準庫或自己手寫的庫替代,該怎么辦?ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

3、已成型的項目,不允許做這些修改怎么辦?ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

所以這里的問題是:有一個項目,想要部署到新的機器上,它涉及很多三方庫,但是機器上都沒有預裝,該怎么辦?ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

對于一個合規的項目,按照約定,通常它會包含一個“requirements.txt ”文件,記錄了該項目的所有依賴庫及其所需的版本號。這是在項目發布前,使用命令pip freeze > requirements.txt 生成的。ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

使用命令pip install -r requirements.txt (在該文件所在目錄執行,或在命令中寫全文件的路徑),就能自動把所有的依賴庫給裝上。ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

但是,如果項目不合規,或者由于其它倒霉的原因,我們沒有這樣的文件,又該如何是好?ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

一個笨方法就是,把項目跑起來,等它出錯,遇到一個導庫失敗,就手動裝一個,然后再跑一遍項目,遇到導庫失敗就裝一下,如此循環……ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

三、自動導入任意缺失的庫

有沒有一種更好的可以自動導入缺失的庫的方法呢?ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

在不修改原有的代碼的情況下,在不需要“requirements.txt”文件的情況下,有沒有辦法自動導入所需要的庫呢?ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

當然有!先看看效果:ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

我們以tornado 為例,第一步操作可看出,我們沒有裝過 tornado,經過第二步操作后,再次導入 tornado 時,程序會幫我們自動下載并安裝好 tornado,所以不再報錯。ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

autoinstall 是我們手寫的模塊,代碼如下:ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

# 以下代碼在 python 3.6.1 版本驗證通過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)復制代碼

這段代碼中使用了sys.meta_path ,我們先打印一下,看看它是個什么東西?ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

Python 3的 import 機制在查找過程中,大致順序如下:ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

在 sys.modules 中查找,它緩存了所有已導入的模塊ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

在 sys.meta_path中查找,它支持自定義的加載器ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

在 sys.path 中查找,它記錄了一些庫所在的目錄名ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

若未找到,拋出ImportError異常ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

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

ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

以上代碼是一個自定義的類庫加載器 AutoInstall,可以實現自動導入三方庫的目的。需要說明一下,這種方法會“劫持”所有新導入的庫,破壞原有的導入方式,因此也可能出現一些奇奇怪怪的問題,敬請留意。ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

sys.meta_path 屬于 Python 探針的一種運用。探針,即import hook,是 Python 幾乎不受人關注的機制,但它可以做很多事,例如加載網絡上的庫、在導入模塊時對模塊進行修改、自動安裝缺失庫、上傳審計信息、延遲加載等等。ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

限于篇幅,我們不再詳細展開了。**后小結一下:ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

可以用 try…except 方式,實現簡單的三方庫導入或者替換ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

已知全部缺失的依賴庫時(如 requirements.txt),可以手動安裝ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

利用 sys.meta_path,可以自動導入任意的缺失庫ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

相關免費學習推薦:python教程(視頻)ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

以上就是學習在python中實現自動導入缺失的庫的詳細內容,更多請關注少兒編程網其它相關文章!ekR少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

預約試聽課

已有385人預約都是免費的,你也試試吧...

主站蜘蛛池模板: 男人午夜影院 | 欧美黄色精品 | xxx精品| 国产成人精品一区二区三区视频 | 久久久久久久久网站 | 亚州精品天堂中文字幕 | 久久永久免费 | 欧美日韩亚洲国内综合网 | 欧美久久久 | 少妇做爰xxxⅹ性视频 | 尤物国产 | 97视频在线播放 | 国产精品久久久久久久久久久久久久久 | 欧美日韩在线播放 | 日韩精品一二三区 | 亚洲最大成人综合 | 麻豆视频在线播放 | 国产精品久久久久久久免费大片 | 国产精品二区在线观看 | 日本视频中文字幕 | yellow视频在线观看免费 | 99久久综合| 一个色av | 精品一区二区三区免费视频 | av亚洲在线 | 日本精品在线视频 | 成人国产精品156免费观看 | 亚洲第一天堂无码专区 | 日韩欧美一区二区在线 | 欧美大片一区二区 | 色污污 | 国产麻豆乱码精品一区二区三区 | 欧美激情亚洲激情 | 精品一区二区久久 | 精品欧美国产 | 国产精品毛片无码 | 亚洲精品成人在线 | 美女搡bbb又爽又猛又黄www | 成人性生交大片免费看在线播放 | 性做久久久久久免费观看欧美 | 亚洲动漫精品 |