Python importlib 动态加载

文章目录

  • 1. importlib 库 概述
  • 2. 导入模块(import_module())
    • 2.1. 导入已安装的模块
    • 2.2. 导入子模块
    • 2.3 通过字符串变量导入模块
  • 3. 重新加载模块(reload())
  • 4. 检查模块是否存在(find_spec())
  • 5. 获取模块路径(find_spec().origin)
  • 6. 加载 .py 文件为模块(spec_from_file_location())
  • 7. 读取模块资源(importlib.resources)
  • 8. 获取模块元数据(importlib.metadata)

1. importlib 库 概述

importlib 是 Python 的动态导入模块,用于运行时加载模块、重新加载模块、自定义模块导入,适用于 插件系统、动态代码执行等场景。
importlib 主要功能
动态导入模块(import_module)
重新加载已导入的模块(reload)
加载 .py 文件为模块(spec_from_file_location)
检查模块是否存在 util.find_spec()
获取模块路径 util.find_spec().origin

importlib.util.spec_from_loader(name, loader, *, origin=None):
这个函数用于创建一个模块规范对象,基于给定的模块名称、加载器对象和可选的模块来源。它可以用于动态加载由自定义加载器提供的模块。
官方:
https://docs.python.org/zh-cn/3/library/importlib.html
参考:
https://blog.csdn.net/u013172930/article/details/146214799
typing.cast:
https://blog.csdn.net/engchina/article/details/144367018

2. 导入模块(import_module())

2.1. 导入已安装的模块

import importlib# 运行时导入模块
math_module = importlib.import_module("math")# 调用模块中的函数
print(math_module.sqrt(16)) # 4.0

等价于

import math
print(math.sqrt(16))        # 4.0

import_module(“math”) 在运行时导入 math。

2.2. 导入子模块

import importlibjson_encoder = importlib.import_module("json.encoder")
print(json_encoder.JSONEncoder)  # <class 'json.encoder.JSONEncoder'>

导入 json.encoder,无需 import json。
等价于

import json
print(json.encoder.JSONEncoder)  # <class 'json.encoder.JSONEncoder'>

2.3 通过字符串变量导入模块

import importlibmodule_name = "random"
random_module = importlib.import_module(module_name)
print(random_module.randint(1, 10)) # 生成随机数

等价于

import random
print(random.randint(0, 10))        # 生成随机数

可用于插件系统,动态加载模块。

3. 重新加载模块(reload())

import importlib
import mymodule  # 假设 `mymodule.py` 已导入importlib.reload(mymodule)  # 重新加载模块

reload() 用于修改代码后立即生效(适用于开发环境)。

4. 检查模块是否存在(find_spec())

importlib.util.find_spec(name, package=None):
这个函数用于查找指定名称的模块规范对象。它会搜索 sys.path 中的目录和 zip 文件,返回一个 ModuleSpec 对象,如果找不到则返回 None。

import importlib.utilspec = importlib.util.find_spec("numpy")
if spec:module = importlib.util.module_from_spec(spec)spec.loader.exec_module(module)  # 加载模块print(module.array([1, 2, 3]))  # 使用 numpy.array

5. 获取模块路径(find_spec().origin)

from importlib.util import find_specspec = find_spec("torch")
if spec:print(f"torch 的位置: {spec.origin}")

6. 加载 .py 文件为模块(spec_from_file_location())

如果 .py 文件不在 Python sys.path 中,不能直接 import,但可以用 importlib 加载:
importlib.util.module_from_spec(spec):
这个函数用于创建一个新的模块对象,基于给定的模块规范对象 spec。返回的模块对象可以通过 sys.modules 进行访问。
importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None):
这个函数用于创建一个模块规范对象,基于给定的模块名称、模块文件路径和可选的加载器对象。它可以用于动态加载位于特定位置的模块。
importlib.abc.loader.exec_module(module)
运行模块代码。
首先、创建文件 “utils/testmodel.py”:

def say_hello():print("hello world")

然后、加载 “utils/testmodel.py” 为模块:

import importlib.util
import sysdef test_model(module_name, file_path):existed_spec = importlib.util.find_spec(module_name)if existed_spec:print(f"module {module_name} existed_spec")spec = existed_specif not spec.loader:raise Exception(f"Failed to load module {module_name} from {file_path!r}")else:print(f"module {module_name} not_existed_spec")# 创建模块 specspec = importlib.util.spec_from_file_location("testmodule", file_path)if not spec or not spec.loader:raise Exception(f"Failed to load module {module_name} from {file_path!r}")module = importlib.util.module_from_spec(spec)# 添加到系统模块if not existed_spec:sys.modules[module_name] = module# 执行模块代码spec.loader.exec_module(module)return moduleif __name__ == "__main__":module_name = "testmodule"# 指定文件路径# file_path = "/utils/testmodel.py"file_path = "utils/testmodel.py"module = test_model(module_name, file_path)module.say_hello()# 查看系统模块是否已经更新existed_spec = importlib.util.find_spec(module_name)if existed_spec:print(f"module {module_name} existed_spec {existed_spec.origin}")

运行结果:

> python.exe .\test.py
module testmodule not_existed_spec
hello world
module testmodule existed_spec D:\works\demo\importlb\utils/testmodel.py

7. 读取模块资源(importlib.resources)

import importlib.resources# # 读取 mypackage 包内的 data.txt 文件
# with importlib.resources.open_text("mypackage", "data.txt") as f:
with importlib.resources.open_text("requests", "__version__.py") as f:content = f.read()print(content)

运行结果:

> python.exe .\test.py
module testmodule not_existed_spec
hello world
module testmodule existed_spec D:\works\demo\importlb\utils/testmodel.py
# .-. .-. .-. . . .-. .-. .-. .-.
# |(  |-  |.| | | |-  `-.  |  `-.
# ' ' `-' `-`.`-' `-' `-'  '  `-'__title__ = "requests"
__description__ = "Python HTTP for Humans."
__url__ = "https://requests.readthedocs.io"
__version__ = "2.32.3"
__build__ = 0x023203
__author__ = "Kenneth Reitz"
__author_email__ = "me@kennethreitz.org"
__license__ = "Apache-2.0"
__copyright__ = "Copyright Kenneth Reitz"
__cake__ = "\u2728 \U0001f370 \u2728"

8. 获取模块元数据(importlib.metadata)

import importlib.metadataprint(importlib.metadata.version("requests"))  # 2.32.3 (获取 `requests` 版本)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(1-6-4) Java IO流实现文件的读取与写入

目录 0.前述概要 1. File类 1.1 概述 1.2 File的重要方法 1.3 java.io 1.3.1 四种抽象类 1.3.2 流 1.3.3 其他常用 I/O 流 2. 字节输入流&#xff08;InputSteam&#xff09; 2.1 关系类图 2.2 应用实现 3. 字节输出流&#xff08;OutputStream&#xff09; 3.1 …

【Proteus仿真】【32单片机-A010】步进电机控制系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD显示当前挡位、方向等&#xff1b; 2、按键控制步进电机挡位、方向等。 二、使用步骤 系统运行后&#xff0c;LCD1602显示当前挡位、方向&#xff1b; 通过按键…

DeepSeek-R1-0528-Qwen3-8B为底座微调领域大模型准备:制作领域专用数据集

前言 想要微调领域大模型,数据的准备是必不可少的。然而微调大模型需要的数据极多,这样花费很多人力和准备。有没有方便又高效的方法?一下子就可以准备大量的领域专用数据集呢? 制作领域专用数据集 这里制作的数据集格式为使用的aphaca格式的 1.启动vllm服务 python -m…

WEB3全栈开发——面试专业技能点P6后端框架 / 微服务设计

一、Express Express是国内大部分公司重点问的。我在本文最后&#xff0c;单独讲解了Express框架。 概念介绍 Express 是基于 Node.js 平台的极简、灵活且广泛使用的 Web 应用框架。它提供了一系列强大的功能&#xff0c;用于构建单页、多页及混合型的 Web 应用程序和 API 服…

游戏开发中的CI/CD优化案例:知名游戏公司Gearbox使用TeamCity简化CI/CD流程

案例背景 关于Gearbox&#xff1a; Gearbox 是一家美国电子游戏公司&#xff0c;总部位于德克萨斯州弗里斯科&#xff0c;靠近达拉斯。Gearbox 成立于1999年&#xff0c;推出过多款史上最具代表性的视频游戏&#xff0c;包括《半衰期》、《战火兄弟连》以及《无主之地》。 团队…

视觉slam--三维刚体运动

线性代数 外积与矩阵乘法的等价性 欧拉角的奇异性--万向死锁 现象 第二个轴旋转度&#xff0c;会导致第三个旋转轴和恶原始坐标轴的第一个旋转轴重合&#xff0c;导致第一次旋转与第三次旋转都使用了同一个轴进行旋转&#xff0c;也就是本质上旋转三次&#xff0c;但是只在两个…

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…

R语言速释制剂QBD解决方案之一

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…

“详规一张图”——新加坡土地利用数据

在城市规划和土地管理领域&#xff0c;精确且详尽的空间数据是进行有效决策的基石。随着地理信息系统&#xff08;GIS&#xff09;技术的发展&#xff0c;我们能够以前所未有的精度和细节来捕捉、分析和展示土地利用信息。这不仅提升了数据的质量和可靠性&#xff0c;还使得城市…

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…

MySQL自定义函数零基础学习教程

1. 引言 想象一下&#xff0c;你在用计算器做数学题。每次计算"圆形面积"时&#xff0c;你都要输入&#xff1a;3.14 半径 半径。如果能把这个计算步骤保存起来&#xff0c;下次只要输入半径就自动算出面积&#xff0c;那该多方便&#xff01; MySQL自定义函数就…

八股---7.JVM

1. JVM组成 1.1 JVM由哪些部分组成?运行流程? 难易程度:☆☆☆ 出现频率:☆☆☆☆ Java Virtual Machine:Java 虚拟机,Java程序的运行环境(java二进制字节码的运行环境)好处:一次编写,到处运行;自动内存管理,垃圾回收机制程序运行之前,需要先通过编译器将…

企业级AI-DevOps工具链的构成及实现方案

企业级AI-DevOps工具链的构成及实现方案 DevOps在AI大模型研发中的重要性及应用背景一、场景驱动的AI产品研发运营机制二、AI-DevOps生产线建设三、基于DevOps的AI大模型研发机制四、基于DevOps的智能体场景研发机制五、场景驱动的应用评估分析机制 DevOps在AI大模型研发中的重…

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…

在 Win10 上 WSL 安装 Debian 12 后,Linux 如何启动 SMTP 服务?

在 WSL 的 Debian 12 中启动 SMTP 服务&#xff08;以 Postfix 为例&#xff09;&#xff0c;请按以下步骤操作&#xff1a; 1. 安装 Postfix sudo apt update sudo apt install postfix mailutils安装过程中会弹出配置窗口&#xff1a; General type of mail configuration&a…

树莓派超全系列教程文档--(59)树莓派摄像头rpicam-apps

这里写目录标题 rpicam-apps libcamera 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 rpicam-apps 树莓派操作系统 Bookworm 将相机捕捉应用程序从 libcamera-\* 重命名为 rpicam-*。符号链接允许用户暂时使用旧名称。尽快采用新的应用程序名称…

【数据结构】图论最短路径算法深度解析:从BFS基础到全算法综述​

最短路径 导读一、最短路径1.1 单源最短路径1.2 各顶点间的最短路径1.3 最短路径算法 二、BFS算法结语内容回顾下一篇预告&#xff1a;挑战带权最短路径&#xff01; 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 欢迎继续探索图算法的…

中国政务数据安全建设细化及市场需求分析

(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…