最近做python專案用到了動態載入模組這個技術,需求很明了。
0、適用於熱執行,在特定的場景呼叫(比如安裝包裡面提供了install.so,用於安裝安裝包本身)
1、不干擾已經存在的模組,就算名字相同
2、開袋即食,用完**,不長久持有引用
3、需要相容.pyd(windows)、.so(linux)
4、使用完整的絕對路徑,不依賴sys.path
5、需要相容3.5+,目前我用的是python3.8
具體的不同之處就是
extensionfileloader 用於載入擴充套件檔案,也就是我們編譯後的.so或者.pyd
sourcelessfileloader 用於載入原始檔,就是我們經常看見的.py原始檔然後,廢話不多說,給乙個開袋即食(相對,版本還是要匹配的)的函式:
@staticmethod
def path_import(file):
"""匯入模組
:param file:
:return:
"""print("\n******************* 開始動態載入模組 *************************")
loader_details = (
importlib.machinery.extensionfileloader,
importlib.machinery.extension_suffixes
)tools_finder = importlib.machinery.filefinder(os.path.dirname(file), loader_details)
print("filefinder: ", tools_finder)
toolbox_specs = tools_finder.find_spec(os.path.basename(file).split(".")[0])
print("find_spec: ", toolbox_specs)
toolbox = importlib.util.module_from_spec(toolbox_specs)
print("module: ", toolbox)
toolbox_specs.loader.exec_module(toolbox)
print("匯入成功 path_import(): ", toolbox)
print("檢查sys中是否包含了此模組: ", toolbox in sys.modules)
print("******************* 動態載入模組完成 *************************\n")
return toolbox
需要匯入的庫:
import os
import importlib.machinery
import importlib.util
上面書寫的函式經過驗證是可用的,當然,我的版本是py3.8,各位朋友要看清楚自己的版本,版本不適用的話要去堆疊那裡看看自己的需求的對應實現(有較低版本的相容**)。
需求記錄完成,希望可以幫到大家。
python非同步載入和動態 Vue動態載入非同步元件
背景 目前我們專案都是按元件劃分的,然後各個元件之間封裝成產品。目前都是採用iframe直接巢狀頁面。專案中我們還是會碰到一些通用的元件跟業務之間有通訊,這種情況下iframe並不是最好的選擇,iframe存在跨域的問題,當然是postmessage還是可以通訊的,但也並非是最好的。目前有這麼乙個場...
python動態載入包
動態載入模組有三種方法 1,使用系統函式 import stringmodule import string 2,使用imp 模組 import imp stringmodule imp.load module string imp.find module string 3,使用exec impor...
python動態載入包
分類 python 2011 09 14 22 18 1684人閱讀收藏 舉報python import string list class module 動態載入模組有三種方法 1,使用系統函式 import stringmodule import string 2,使用imp 模組 import...