如何动态导入 Python 模块?
Python 具有一项功能,允许您构建和存储类和函数以供以后使用。模块是包含这些方法和类集合的文件的名称。一个模块可能包含更多模块。
让我们考虑以下示例,一次导入多个模块 -
import sys, os, math, datetime print ('模块已导入')
这将一次导入以下所有四个模块:datetime(将日期作为日期对象进行操作)、math(由可以计算给定角度的不同三角比的函数组成)、sys(用于正则表达式)和 os(用于目录列表等操作系统功能)。
模块已导入
动态导入模块
计算机程序可以在运行时将库(或其他二进制文件)加载到内存中,检索其包含的函数和变量的地址,调用这些函数或访问这些变量,然后从内存中卸载库。此过程称为动态加载。
以下是动态导入模块的不同方法。
使用 __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 模块
Python 导入机制(从包和模块加载代码)部分由 imp 模块中的函数公开。它是动态导入模块的一种方法,在您编写代码但不确定需要导入的模块名称的情况下很有用。
示例
首先,创建一个模块"module1.py",其中包含一个名为"Dynamic"的类。执行 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
dict 是 globals() 方法的结果。导入模块时返回给我们的对象可以设置为每个库的 lib 键。