如何动态导入Python模块
Python具有一种能力,允许您构建和存储类和函数以供以后使用。模块是具有这些方法和类集合的文件的名称。一个模块可能包含更多的模块。
让我们考虑以下示例一次导入多个模块-
import sys, os, math, datetime
print ('The modules are imported')
这一次性导入以下四个模块:datetime(用于操作日期对象)、math(包含计算给定角度的不同三角函数比例的函数)、sys(用于正则表达式)和os(用于操作系统功能,如目录列表)。
The modules are imported
动态导入模块
计算机程序可以在运行时将库(或其他二进制文件)加载到内存中,检索其中包含的函数和变量的地址,调用这些函数或访问这些变量,然后从内存中卸载库。这个过程被称为动态加载。
以下是动态导入模块的不同方式。
使用__import__()
方法
所有类都拥有名为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键。