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

coldplay.xixi
發布: 2020-11-02 17:27:57
轉載
1477 人瀏覽過

python教學欄位介紹實作自動匯入缺少的函式庫。

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

導入失敗問題,通常分為兩種:一種是導入自己寫的模組(即以 .py 為後綴的檔案),另一種是導入三方庫。本文主要討論第二種情況,今後有機會,我們再詳細討論其它的相關主題。

解決導入 Python函式庫失敗的問題,其實關鍵是在運作環境中裝上缺少的函式庫(注意是否為虛擬環境),或是使用恰當的替代方案。這個問題又分為三種情況:

一、單一模組中缺少的函式庫

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

try:    import requestsexcept ImportError:    import os
    os.system('pip install requests')    import requests复制代码
登入後複製

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

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

ry:    import simplejson as jsonexcept ImportError:    import json复制代码
登入後複製

這樣寫的效果是,優先導入三方庫simplejson,如果找不到,那就使用內建的標準函式庫 json

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

如果真找不到相容的標準函式庫,也可以自己寫一個模組(如 my_json.py),實作想要的東西,然後在except語句中導入它。

ry:    import simplejson as jsonexcept ImportError:    import my_json as json复制代码
登入後複製

碼字不容易廢話兩句:有需要學習資料的或是有技術問題交流「點擊」即可

二、整個專案中缺少的函式庫

以上的想法是針對開發中的項目,但是它有幾個不足:

1、在程式碼中對每個可能缺少的三方函式庫都pip install ,並不可取;

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

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

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

對於一個合規的項目,按照約定,通常它會包含一個「requirements.txt 」文件,記錄了​​該項目的所有依賴函式庫及其所需的版本號。這是在專案發布前,使用指令pip freeze > requirements.txt 產生的。

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

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

一個笨方法就是,把項目跑起來,等它出錯,遇到一個導庫失敗,就手動裝一個,然後再跑一遍項目,遇到導庫失敗就裝一下,如此循環… …

三、自動導入任意缺少的函式庫

有沒有一種更好的可以自動導入缺少的函式庫的方法呢?

在不修改原有的程式碼的情況下,在不需要「requirements.txt」檔案的情況下,有沒有辦法自動匯入所需的函式庫呢?

當然有!先看看效果:

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

我們以tornado 為例,第一步操作可看出,我們沒有裝過 tornado,經過第二步驟操作後,再次匯入 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)复制代码
登入後複製

這段程式碼中使用了sys.meta_path ,我們先列印一下,看看它是什麼東西?

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

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

  2. sys.modules 中查找,它快取了所有已導入的模組

  3. sys.meta_path中查找,它支援自訂的載入器

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

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

其中要注意,sys.meta_path 在不同的Python版本中有所差異,例如它在Python 2 Python 3 中差異很大;在較新的Python 3 版本(3.4 )中,自訂的載入器需要實作find_spec方法,而早期的版本用的則是find_module

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

以上程式碼是一個自訂的類別庫載入器 AutoInstall,可以實現自動導入三方庫的目的。需要說明一下,這種方法會「劫持」所有新導入的庫,破壞原有的導入方式,因此也可能出現一些奇奇怪怪的問題,敬請留意。

sys.meta_path 屬於 Python 探針的一種運用。探針,也就是import hook,是 Python 幾乎不受人關注的機制,但它可以做很多事,例如載入網路上的函式庫、在導入模組時對模組進行修改、自動安裝缺失庫、上傳審計資訊、延遲載入等等。

限於篇幅,我們不再詳細展開了。最後小結一下:

  1. 可以用try…except 方式,實作簡單的三方函式庫導入或取代

  2. ##已知全部缺少的依賴函式庫時(如

    requirements.txt),可以手動安裝

  3. 利用

    sys.meta_path,可以自動匯入任意的缺失庫

相關免費學習推薦:python教學(影片)

以上是學習在python中實現自動導入缺失的函式庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:juejin.im
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!