中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

怎么在Python中自動導(dǎo)入缺失的庫-創(chuàng)新互聯(lián)

怎么在Python中自動導(dǎo)入缺失的庫?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬主機(jī)、營銷軟件、網(wǎng)站建設(shè)、新昌網(wǎng)站維護(hù)、網(wǎng)站推廣。

一、單個(gè)模塊中缺失的庫

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

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

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

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

try:
  import simplejson as json
except ImportError:
  import json

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

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

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

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

二、整個(gè)項(xiàng)目中缺失的庫

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

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

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

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

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

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

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

當(dāng)然有!先看看效果:

怎么在Python中自動導(dǎo)入缺失的庫

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

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

# 以下代碼在 python 3.6.1 版本驗(yàn)證通過
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 ,我們先打印一下,看看它是個(gè)什么東西?

怎么在Python中自動導(dǎo)入缺失的庫

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

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

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

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

若未找到,則拋出 ImportError 異常

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

怎么在Python中自動導(dǎo)入缺失的庫

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

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

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

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

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

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

看完上述內(nèi)容,你們掌握怎么在Python中自動導(dǎo)入缺失的庫的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

名稱欄目:怎么在Python中自動導(dǎo)入缺失的庫-創(chuàng)新互聯(lián)
本文URL:http://www.rwnh.cn/article34/csicse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站導(dǎo)航、微信公眾號靜態(tài)網(wǎng)站、搜索引擎優(yōu)化品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
万全县| 朝阳市| 独山县| 获嘉县| 泌阳县| 扎鲁特旗| 平和县| 富裕县| 阿拉善左旗| 封开县| 正安县| 神农架林区| 靖宇县| 大理市| 柯坪县| 鄂托克旗| 响水县| 芮城县| 辽阳县| 普兰县| 浦东新区| 常州市| 加查县| 澳门| 申扎县| 博兴县| 扶绥县| 航空| 剑川县| 区。| 额敏县| 安塞县| 保山市| 高密市| 葫芦岛市| 沈阳市| 榕江县| 连城县| 龙岩市| 九江市| 南丹县|