title: Python脚本中动态加载模块(module) top: false cover: false toc: true mathjax: true date: 2019-08-29 12:07:01 password: summary: 在Python脚本中根据传入的参数动态加载指定的模块(module)。 tags: - Python categories: - Python
参考资料
内容简介
在Github上看到一个在Zabbix Userparameter中调用AWS的API的Python脚本,里面用到了importlib这个模块,觉得挺实用的,做下笔记。
使用场景:
在编写Python脚本的时候,我们可能会想设计成一个入口(gateway)脚本文件接收一个服务(service)参数,然后 在gateway脚本中根据service参数去动态加载一个Python模块文件(module),从而达到“解耦”的目的。
代码范本
先看脚本目录结构。
Python的模块与目录关系
aws_discovery.py为主脚本,./aws_discovery.py --service 'rds'将会动态加载./discovery/rds.py模块。
#!/usr/bin/env python
# coding=utf-8
import argparse
import importlib
# argparse模块用来处理传给脚本的参数。
parser = argparse.ArgumentParser(
description="Description of this script."
)
# "--service" 为此脚本的标志(flag);dest会成为一个属性名记录在parser对象中。
# 假设此脚本为"gateway.py",那么运行脚本时使用以下方式传参:
# python gateway.py --service
parser.add_argument("--service", dest="service",
help="Service to discover instances in",
required=True, type=str)
# 从parser获取参数集合,args对象实际为Namespace类实例,而Namespace就是一个简单的对象,
# 里面就是一堆在add_argument方法中定义的属性。
args = parser.parse_args()
# import_module方法第一个参数为将导入的模块的文件名,第二个参数为模块文件的目录名。
discovery_module = importlib.import_module(".{}".format(args.service), "discovery")