搜尋
首頁後端開發Python教學學習在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中文網其他相關文章!

陳述
本文轉載於:juejin。如有侵權,請聯絡admin@php.cn刪除
Python:遊戲,Guis等Python:遊戲,Guis等Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python vs.C:申請和用例Python vs.C:申請和用例Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時的Python計劃:一種現實的方法2小時的Python計劃:一種現實的方法Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Apr 02, 2025 am 07:12 AM

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用