91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Python中自動導入缺失的庫

發布時間:2021-04-17 17:25:40 來源:億速云 閱讀:119 作者:Leah 欄目:開發技術

怎么在Python中自動導入缺失的庫?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一、單個模塊中缺失的庫

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

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

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

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

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

try:
  import simplejson as json
except 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 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中自動導入缺失的庫

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+)中,自定義的加載器需要實現find_spec 方法,而早期的版本用的則是find_module 。

怎么在Python中自動導入缺失的庫

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

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

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

  • 可以用 try...except 方式,實現簡單的三方庫導入或者替換

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

  • 利用 sys.meta_path,可以自動導入任意的缺失庫

看完上述內容,你們掌握怎么在Python中自動導入缺失的庫的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

福泉市| 出国| 郯城县| 伊宁市| 义乌市| 闽侯县| 潼南县| 黄石市| 镇江市| 舟曲县| 大理市| 吉首市| 霍林郭勒市| 西城区| 邹平县| 广东省| 百色市| 盐津县| 林甸县| 平度市| 自治县| 麻阳| 肃北| 安国市| 顺义区| 平安县| 田东县| 内乡县| 铜山县| 绥棱县| 普定县| 灵川县| 齐河县| 楚雄市| 和林格尔县| 正宁县| 合山市| 天气| 仁化县| 西贡区| 上饶县|