如何動態匯入Python模組?
Python 具有允許您構建和儲存類和函式以供以後使用 的功能。模組是包含這些方法和類集合的檔案的名稱。一個模組可能包含更多模組。
讓我們考慮以下示例來一次匯入多個模組:
import sys, os, math, datetime print ('The modules are imported')
這會一次性匯入所有四個模組:datetime(將日期作為日期物件進行操作)、math(包含可以計算給定角度的不同三角比率的函式)、sys(用於正則表示式)和 os(用於作業系統功能,如目錄列表)。
The modules are imported
動態匯入模組
計算機程式可以在執行時將庫(或其他二進位制檔案)載入到記憶體中,檢索其中包含的函式和變數的地址,呼叫這些函式或訪問這些變數,然後從記憶體中解除安裝庫。這個過程稱為動態載入。
以下是動態匯入模組的不同方法。
使用 __import__() 方法
所有類都擁有 dunder 方法(也稱為魔術方法)__import__(),它以雙下劃線開頭和結尾。它用於在類例項內匯入模組或類。
示例
可以使用內建的 __import__ 函式而不是 import 語句獲得類似的結果,儘管此方法實際上接受字串作為輸入。就像您指定了 import sys 一樣,變數 sys 現在是 sys 模組。os 模組現在是變數 os,依此類推。
math = __import__('math') os = __import__('os') sys = __import__('sys') datetime = __import__('datetime')
輸出
因此,__import__ 匯入模組,但需要一個字串引數。在本例中,可以已使用變數或函式呼叫的輸出代替用作您匯入的模組的硬編碼文字。
此外,您為模組分配的變數不必與模組具有相同的名稱。可以透過匯入多個模組來建立列表。
>>> math <module 'math' (built-in)> >>> sys <module 'sys' (built-in)> >>> os <module 'os' from 'C:\Users\Lenovo\AppData\Local\Programs\Python\Python310\lib\os.py'> >>> datetime <module 'datetime' from 'C:\Users\Lenovo\AppData\Local\Programs\Python\Python310\lib\datetime.py'>
使用 imp 模組
imp 模組中的函式部分公開 Python 匯入機制,該機制從包和模組載入程式碼。這是動態匯入模組的一種方法,在編寫程式碼但不知道需要匯入的模組名稱的情況下很有用。
示例
首先,建立一個包含名為“Dynamic”的類的模組“module1.py”。執行 import_module() 函式時將呼叫此模組。
class Dynamic: def dynamic(): print("Welcome to TutorialsPoint")
下面的示例演示了 imp 模組的使用。它提供了 find_module() 函式,該函式在當前工作目錄中找到上面定義的模組。import_module() 函式將動態匯入程式中的模組及其成員。然後,return 語句返回模組名稱和模組中類的名稱。
import imp import sys # function to dynamically load module def dynamic_module_import(module_name, class_name): # find_module() is used to find the module in current directory # it gets the pointer, path and description of the module try: file_pointer, file_path, description = imp.find_module(module_name) except ImportError: print ("Imported module {} not found".format(module_name)) try: # load_module dynamically loads the module # the parameters are pointer, path and description of the module load_module = imp.load_module(module_name, file_pointer, file_path, description) except Exception as e: print(e) try: load_class = imp.load_module("{}.{}".format(module_name, class_name), file_pointer, file_path, description) except Exception as e: print(e) return load_module, load_class if __name__ == "__main__": module, module_1 = dynamic_module_import("module1", "Dynamic") print (module,module_1)
輸出
以下是上述程式碼的輸出:
<module 'module1' from 'C:\Users\Lenovo\Desktop\module1.py'> <module 'module1.Dynamic' from 'C:\Users\Lenovo\Desktop\module1.py'>
使用 importlib 包中的 import_module
可以使用 importlib 包中的 import_module(moduleName) 方法動態匯入 Python 模組。必須提供表示 moduleName 的字串。
示例
以下是使用 importlib 包動態匯入模組的示例:
from importlib import import_module moduleName = "os" globals()[moduleName] = import_module(moduleName) print ('The module name is :',moduleName)
輸出
以下是上述程式碼的輸出:
The module name is : os
使用 for 迴圈進行動態匯入
如果希望動態匯入模組列表,也可以從 for 迴圈中執行此操作。
示例
import importlib modnames = ["os", "sys", "math"] for lib in modnames: globals()[lib] = importlib.import_module(lib) print ('The module names are :',lib)
輸出
The module names are : os The module names are : sys The module names are : math
globals() 方法的結果是一個字典。在匯入模組後返回給我們的物件可以設定為每個庫的 lib 鍵。