一行代碼實現Python動態加載依賴

前幾天在一個開源項目裡遇到好多用戶反饋,不會安裝依賴,或者執行 pip install -r requirements.txt 沒有反應。

可能造成的原因有很多種,一一排查起來也很麻煩。

想一勞永逸解決這個問題,一般大傢都是到 site-packages 裡面把所需要的包導出來,放到項目根目錄。

但這樣終究太過粗糙,不符合Python優雅的個性。

所以我就想,能不能動態引入包,如果沒有的話,再調用 pip 下載。最後也差不多實現瞭我的設想。

我大概查瞭一下,現在好像沒有人用過這個方案,我自己使用感覺還是很方便的,分享給大傢。

雖然想打成library給大傢下載的,後來想到這又要依賴pip,違背瞭做動態依賴的本意
所以我推薦是使用 快速開始 – 註入代碼運行 中的方式

快速開始

跪求star GitHub – louisyoungx/dypend

通過 pip 安裝運行

在 PyPI 下載 dypend依賴包

pip install dypend

在本地生成 requirements.txt 依賴文件

pip freeze > requirements.txt

在項目的入口文件的最上層引入 dypend ,不用更改任何其他代碼

import dypend

這時 dypend會檢查你的Python環境中是否都有 requirements.txt 中的包,如果沒有, dypend會調用 pip下載。

註入代碼運行

在本地生成 requirements.txt 依賴文件

pip freeze > requirements.txt

在項目的入口文件的最上層添加如下代碼,不用更改任何其他代碼

import os
import re
REQUIREMENTS = os.getcwd() + '/requirements.txt'
def getDepends():
   requirements = open(REQUIREMENTS, 'r')
   libs = requirements.readlines()
   libList = []
   for lib in libs:
       try:
           name = re.search("^.+(?===)", lib).group(0)
           version = re.search("(?<===).+$", lib).group(0)
           libDict = {
               "name": name,
               "version": version
          }
           libList.append(libDict)
       except:
           continue
   return libList
def importLib():
   """Load python dependent libraries dynamically"""
​
   libList = getDepends()
​
   from pip._internal import main as pip_main
   import importlib
​
   def install(package):
       pip_main(['install', package])
​
   createVar = locals()
​
   for lib in libList:
       print(lib)
       try:
           createVar[lib["name"]] = importlib.import_module(lib["name"])
       except Exception as e:
           try:
               install(f'{lib["name"]}=={lib["version"]}')
               createVar[lib["name"]] = importlib.import_module(lib["name"])
           except Exception as e:
               print(e)
importLib()

這時dypend會檢查你的Python環境中是否都有 requirements.txt 中的包,如果沒有,dypend會自動下載。

到此這篇關於一行代碼實現Python動態加載依賴的文章就介紹到這瞭,更多相關Python動態加載依賴內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: