真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

在python中如何實現(xiàn)自動導(dǎo)入缺失的庫

小編給大家分享一下在python中如何實現(xiàn)自動導(dǎo)入缺失的庫,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

成都創(chuàng)新互聯(lián)公司專注于聶拉木企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城系統(tǒng)網(wǎng)站開發(fā)。聶拉木網(wǎng)站建設(shè)公司,為聶拉木等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站開發(fā),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

導(dǎo)入失敗問題,通常分為兩種:一種是導(dǎo)入自己寫的模塊(即以 .py 為后綴的文件),另一種是導(dǎo)入三方庫。

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

一、單個模塊中缺失的庫

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

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

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

在某些開源項目中,我們可能還會看到如下的寫法(以 json 為例):

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

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

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

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

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

碼字不易廢話兩句:有需要學(xué)習資料的或者有技術(shù)問題交流“點擊”即可

二、整個項目中缺失的庫

以上的思路是針對開發(fā)中的項目,但是它有幾個不足:

1、在代碼中對每個可能缺失的三方庫都 pip install,并不可?。?/p>

2、某個三方庫無法被標準庫或自己手寫的庫替代,該怎么辦?

3、已成型的項目,不允許做這些修改怎么辦?

所以這里的問題是:有一個項目,想要部署到新的機器上,它涉及很多三方庫,但是機器上都沒有預(yù)裝,該怎么辦?

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

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

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

一個笨方法就是,把項目跑起來,等它出錯,遇到一個導(dǎo)庫失敗,就手動裝一個,然后再跑一遍項目,遇到導(dǎo)庫失敗就裝一下,如此循環(huán)……

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

有沒有一種更好的可以自動導(dǎo)入缺失的庫的方法呢?

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

當然有!先看看效果:

在python中如何實現(xiàn)自動導(dǎo)入缺失的庫

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

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

# 以下代碼在 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)復(fù)制代碼

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

在python中如何實現(xiàn)自動導(dǎo)入缺失的庫

  1. Python 3import 機制在查找過程中,大致順序如下:

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

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

  4. sys.path 中查找,它記錄了一些庫所在的目錄名

  5. 若未找到,拋出ImportError異常

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

在python中如何實現(xiàn)自動導(dǎo)入缺失的庫

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

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

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

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

  2. 已知全部缺失的依賴庫時(如 requirements.txt),可以手動安裝

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

看完了這篇文章,相信你對在python中如何實現(xiàn)自動導(dǎo)入缺失的庫有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


當前文章:在python中如何實現(xiàn)自動導(dǎo)入缺失的庫
當前URL:http://weahome.cn/article/pjjgpg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部