如何动态导入Python模块

如何动态导入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键。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程