import importlib.util
# 导入模块
module_path1 = "my_module.py"
# 模块1的路径
module_path2 = "/home/user/my_module.py"
# 模块2的路径
module_path3 = "package.subpackage.my_module.py"
# 模块3的路径
def load_module(module_path):
# 根据路径加载模块
module_name = module_path.split("/")[-1].replace(".py", "")
# 取出模块名,去掉后缀".py"
if "/" in module_path:
# 如果路径中含有"/",说明是在一个包内部,需要重新定义spec以便添加包路径
package_path = "/".join(module_path.split("/")[:-1])
spec = importlib.util.spec_from_file_location(module_name, module_path, submodule_search_locations=[package_path])
else:
# 如果路径不含本符号,说明是直接加载单一模块
spec = importlib.util.spec_from_file_location(module_name, module_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# 运行模块
return module
# 分别加载三个模块
my_module1 = load_module(module_path1)
my_module2 = load_module(module_path2)
my_module3 = load_module(module_path3)
修改版:
import importlib
import sys
def load_module(module_path):
"""
根据不同形式的module_path来对模块进行加载
参数:
module_path -- 字符串类型,模块的路径,可以是 "模块名"、"模块名.模块名"、"模块名.py" 或者 "模块名/模块名.py" 中的任意一种形式
返回值:
加载成功则返回对应的模块对象,否则返回 None
"""
# 如果 module_path 以 ".py" 结尾,则去掉 ".py" 后缀
if module_path.endswith(".py"):
module_path = module_path[:-3]
# 如果 module_path 中包含 "/",则将 "/" 替换为 "."
module_name = module_path.replace("/", ".")
try:
# 根据 module_name 直接导入模块
return importlib.import_module(module_name)
except ImportError:
pass
try:
# 如果 module_name 无法直接导入,则尝试从 sys.path 中查找 module_path 对应的模块
module_spec = importlib.util.find_spec(module_path)
if module_spec is None:
return None
# 使用 module_spec.loader 加载模块并返回模块对象
module = importlib.util.module_from_spec(module_spec)
module_spec.loader.exec_module(module)
return module
except ImportError:
pass
return None
if __name__ == "__main__":
# 加载模块,使用 ".py"、"/"、"."、"模块名"、"模块名.模块名" 等形式均可
module = load_module("test_module")
if module is not None:
# 执行模块中的测试函数
module.test_function()
运行示例:
假设要加载的模块结构如下:
test_module/
__init__.py
test_submodule.py
util.py
假设 util.py 中定义了一个辅助函数 helper(),test_submodule.py 中定义了一个测试函数 test_function()
执行以下命令即可执行 test_submodule.py 中的 test_function() 函数:
python load_module.py test_module/test_submodule.py