學習在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
」檔案的情況下,有沒有辦法自動匯入所需的函式庫呢?
當然有!先看看效果:
我們以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 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
,可以自動匯入任意的缺失庫
相關免費學習推薦:python教學(影片)
以上是學習在python中實現自動導入缺失的函式庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。
