最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 實現(xiàn)自動導入缺失的庫

 更新時間:2019年10月29日 09:25:19   作者:豌豆花下貓  
這篇文章主要介紹了Python 實現(xiàn)自動導入缺失的庫,解決導入 Python 庫失敗的問題,本文分三種情況給大家介紹,需要的朋友可以參考下

在寫 Python 項目的時候,我們可能經(jīng)常會遇到導入模塊失敗的錯誤:ImportError: No module named 'xxx' 或者 ModuleNotFoundError: No module named 'xxx' 。

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

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

一、單個模塊中缺失的庫

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

try:
  import requests
except ImportError:
  import os
  os.system('pip install requests')
  import requests

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

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

try:
  import simplejson as json
except ImportError:
  import json

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

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

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

try:
  import simplejson as json
except ImportError:
  import my_json as json

二、整個項目中缺失的庫

以上的思路是針對開發(fā)中的項目,但是它有幾個不足:1、在代碼中對每個可能缺失的三方庫都 pip install,并不可?。?、某個三方庫無法被標準庫或自己手寫的庫替代,該怎么辦?3、已成型的項目,不允許做這些修改怎么辦?

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

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

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

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

一個笨方法就是,把項目跑起來,等它出錯,遇到一個導庫失敗,就手動裝一個,然后再跑一遍項目,遇到導庫失敗就裝一下,如此循環(huán)……(此處省略 1 萬句臟話)……

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

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

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

當然有!先看看效果:

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

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

# 以下代碼在 python 3.6.1 版本驗證通過
import sys
import os
from importlib import import_module
class 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 None

sys.meta_path.append(AutoInstall)

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

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

  1. 在 sys.modules 中查找,它緩存了所有已導入的模塊
  2. 在 sys.meta_path 中查找,它支持自定義的加載器
  3. 在 sys.path 中查找,它記錄了一些庫所在的目錄名

若未找到,則拋出 ImportError 異常

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

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

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

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

  • 可以用 try...except 方式,實現(xiàn)簡單的三方庫導入或者替換
  • 已知全部缺失的依賴庫時(如 requirements.txt),可以手動安裝
  • 利用 sys.meta_path,可以自動導入任意的缺失庫

參考資料:

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

總結

以上所述是小編給大家介紹的Python 實現(xiàn)自動導入缺失的庫,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

相關文章

  • python+opencv邊緣提取與各函數(shù)參數(shù)解析

    python+opencv邊緣提取與各函數(shù)參數(shù)解析

    這篇文章主要介紹了python+opencv邊緣提取與各函數(shù)參數(shù)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • python 對象真假值的實例(哪些視為False)

    python 對象真假值的實例(哪些視為False)

    這篇文章主要介紹了python 對象真假值的實例(哪些視為False),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • python基礎之停用詞過濾詳解

    python基礎之停用詞過濾詳解

    這篇文章主要介紹了python基礎之停用詞過濾詳解,文中有非常詳細的代碼示例,對正在學習python基礎的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • 詳解Python直接賦值,深拷貝和淺拷貝

    詳解Python直接賦值,深拷貝和淺拷貝

    這篇文章主要介紹了Python直接賦值,深拷貝和淺拷貝的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Python 實現(xiàn)12306登錄功能實例代碼

    Python 實現(xiàn)12306登錄功能實例代碼

    這篇文章主要介紹了Python 實現(xiàn)12306登錄功能的完整代碼,需要的朋友可以參考下
    2018-02-02
  • python生成不重復隨機數(shù)和對list亂序的解決方法

    python生成不重復隨機數(shù)和對list亂序的解決方法

    下面小編就為大家分享一篇python生成不重復隨機數(shù)和對list亂序的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python數(shù)據(jù)歸一化及三種方法詳解

    python數(shù)據(jù)歸一化及三種方法詳解

    這篇文章主要介紹了python數(shù)據(jù)歸一化及三種方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Python導入模塊的3種方式超級詳細講解

    Python導入模塊的3種方式超級詳細講解

    這篇文章主要給大家介紹了關于Python導入模塊的3種方式,本文介紹了在Python中使用模塊的概念和不同的導入方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 跟老齊學Python之Python文檔

    跟老齊學Python之Python文檔

    文檔,這個詞語在經(jīng)常在程序員的嘴里冒出來,有時候他們還經(jīng)常以文檔有沒有或者全不全為標準來衡量一個軟件項目是否高大上。那么,軟件中的文檔是什么呢?有什么要求呢?python文檔又是什么呢?文檔有什么用呢?
    2014-10-10
  • python與xml數(shù)據(jù)的交互詳解

    python與xml數(shù)據(jù)的交互詳解

    這篇文章主要介紹了python與xml數(shù)據(jù)的交互詳解,文章圍繞主題站卡詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07

最新評論

游戏| 和林格尔县| 寿阳县| 荃湾区| 彰武县| 建始县| 高雄县| 苏尼特右旗| 连江县| 稷山县| 澜沧| 西盟| 女性| 土默特左旗| 昌都县| 佛学| 玛纳斯县| 洛宁县| 河津市| 永安市| 丰原市| 无为县| 灵山县| 苏尼特右旗| 彭州市| 丰都县| 洪湖市| 措勤县| 达拉特旗| 兴业县| 新兴县| 九龙坡区| 沭阳县| 泰和县| 凉城县| 黔江区| 思南县| 盐城市| 昌吉市| 灯塔市| 河南省|