目錄
一、單一模組中缺少的函式庫
二、整個專案中缺少的函式庫
三、自動導入任意缺少的函式庫
首頁 後端開發 Python教學 學習在python中實現自動導入缺失的函式庫

學習在python中實現自動導入缺失的函式庫

Nov 02, 2020 pm 05:27 PM
python 導入庫

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」檔案的情況下,有沒有辦法自動匯入所需的函式庫呢?

當然有!先看看效果:

學習在python中實現自動導入缺失的函式庫

我們以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中實現自動導入缺失的函式庫

  1. Python 3import 機制在尋找過程中,大致順序如下:

  2. sys.modules 中查找,它快取了所有已導入的模組

  3. sys.meta_path中查找,它支援自訂的載入器

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

  5. 若找不到,拋出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 幾乎不受人關注的機制,但它可以做很多事,例如載入網路上的函式庫、在導入模組時對模組進行修改、自動安裝缺失庫、上傳審計資訊、延遲載入等等。

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

  1. 可以用try…except 方式,實作簡單的三方函式庫導入或取代

  2. ##已知全部缺少的依賴函式庫時(如

    requirements.txt),可以手動安裝

  3. 利用

    sys.meta_path,可以自動匯入任意的缺失庫

相關免費學習推薦:python教學(影片)

以上是學習在python中實現自動導入缺失的函式庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1273
29
C# 教程
1252
24
PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

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

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

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

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

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

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

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

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

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

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

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

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

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

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

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

See all articles