python中引用加载其他项目的包 importlib.util

为什么需要importlib.util

awz想要写一个小的demo,但是他发现自己原来写过一个很大的项目里面有一个小模块就实现了这个demo的功能,但是这个时候awz发现这个项目很大,这个包里面引用了很多其他的模块,这时候awz应该怎么办呢?

a. 将这个模块复制出来

b. 重写这个功能

显然这都不是很好的解决方法,这时候importlib.util随着python3.5横空出世,解决了这样的问题

 

importlib.util 介绍

importlib.util 是 Python 标准库中的一个模块,主要用于导入和管理模块。importlib 模块提供了更灵活和强大的方式来导入模块,而不仅仅是通过 import 语句。importlib.util 包含一些实用程序函数,帮助用户动态地加载模块,检查模块的属性,以及进行模块相关的其他操作。

 

例子

场景

想象一下,你正在开发两个项目:project_a 和 project_b。现在,你需要在 project_b 中使用 project_a 的一个模块。目录结构如下:

C:\
└── project_a\
    └── my_module.py
C:\
└── project_b\
    └── use_module.py

我们要在 use_module.py 中动态加载 my_module.py 并使用其中的内容。

 

解决方案

第一步,先设置路径并添加到 sys.path

import importlib.util
import sys

# 绝对路径
module_path = r"C:\project_a\my_module.py"
base_dir = r"C:\project_a"

# 添加依赖模块路径到sys.path
if base_dir not in sys.path:
    sys.path.append(base_dir) #将引用包的项目加入环境变量,这样里面的import才可以找到

 

第二步,用importlib.util 来加载这个模块

# 获取模块名
module_name = "my_module"

# 从文件路径中加载模块规范
spec = importlib.util.spec_from_file_location(module_name, module_path)
# 创建一个新的模块实例
module = importlib.util.module_from_spec(spec)
# 将模块添加到sys.modules中
sys.modules[module_name] = module
# 执行模块的代码
spec.loader.exec_module(module)

三,就可以愉快的使用它了:

# 假设my_module.py中有一个函数叫做greet
greet = module.greet

# 调用这个函数
greet("php is the best language")

一些小tips

路径处理:使用 os.path 处理路径,以提高代码的可移植性。
错误处理:加入 try-except 块来处理可能的导入错误,确保代码的健壮性。