一行代碼實現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!
推薦閱讀:
- python 動態導入模塊實現模塊熱更新的方法
- Python中requirements.txt簡介(推薦)
- python正則表達式re.group()用法
- python 模塊重載的五種方法
- pycharm上的python虛擬環境移到離線機器上的方法步驟