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

更新于:2022年11月23日

14K+ 浏览量

启动您的 职业生涯

完成课程获得认证

开始
广告
© . All rights reserved.