日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

access 导入txt 找不到可安装的isam_由浅入深:Python 中如何实现自动导入缺失的库?...

發布時間:2025/3/11 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 access 导入txt 找不到可安装的isam_由浅入深:Python 中如何实现自动导入缺失的库?... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??“Python貓” ,一個值得加星標的公眾號

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

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

解決導入 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 (在該文件所在目錄執行,或在命令中寫全文件的路徑),就能自動把所有的依賴庫給裝上。

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

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

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

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

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

當然有!先看看效果:

我們以 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 3 的 import 機制在查找過程中,大致順序如下:
  • 在 sys.modules 中查找,它緩存了所有已導入的模塊
  • 在 sys.meta_path 中查找,它支持自定義的加載器
  • 在 sys.path 中查找,它記錄了一些庫所在的目錄名
  • 若未找到,拋出ImportError異常

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

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

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

限于篇幅,我們不再詳細展開了。最后小結一下:
  • 可以用 try…except 方式,實現簡單的三方庫導入或者替換
  • 已知全部缺失的依賴庫時(如 requirements.txt),可以手動安裝
  • 利用 sys.meta_path,可以自動導入任意的缺失庫

參考資料: https://github.com/liuchang0812/slides/tree/master/pycon2015cnhttp://blog.konghy.cn/2016/10/25/python-import-hookhttps://docs.python.org/3/library/sys.html#sys.meta_path作者簡介:豌豆花下貓,生于廣東畢業于武大,現為蘇漂程序員,有一些極客思維,也有一些人文情懷,有一些溫度,還有一些態度。

優質文章,推薦閱讀:

辟謠錯誤的爬蟲說法,使用正確的爬蟲姿勢為什么range不是迭代器?range到底是什么類型?Python 工匠:使用裝飾器的技巧

Python 從業十年是種什么體驗?老程序員的一篇萬字經驗分享

激勵貓哥寫出更多好文

總結

以上是生活随笔為你收集整理的access 导入txt 找不到可安装的isam_由浅入深:Python 中如何实现自动导入缺失的库?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。