如何为Python项目添加Argparse参数批量执行指定类别下所有脚本?
实现批量运行指定类别所有脚本的方案
我来给你梳理下怎么实现这个功能,步骤清晰,后续扩展脚本也很方便:
1. 先整理类别与脚本的映射关系
首先把每个类别对应的脚本信息统一管理起来,用一个字典存储,这样新增脚本只需要往字典里加条目就行,不用改执行逻辑。建议把脚本名作为key,方便单个脚本查找:
# 定义类别-脚本映射,key是脚本名,value包含模块路径和类名 CATEGORY_SCRIPTS = { "web": { "S1_HTTP_HEADER": { "module_path": "scripts.WEB_S1_HTTPHEADER", "class_name": "RequestHeader" }, # 往后新增web类脚本直接加在这里就行,比如: # "S2_XXX_SCRIPT": { # "module_path": "scripts.WEB_S2_XXX", # "class_name": "XXXClass" # } } # 其他类别也可以按这个格式添加 }
2. 修改Argparse参数配置
给参数添加互斥组,确保--script和--all不能同时使用(毕竟不能既指定单个脚本又跑全部):
import argparse parser = argparse.ArgumentParser(description="运行指定类别下的脚本任务") parser.add_argument("--category", required=True, help="指定脚本所属类别,比如web") # 创建互斥组,用户必须选其中一个参数 mode_group = parser.add_mutually_exclusive_group(required=True) mode_group.add_argument("--script", help="指定要运行的单个脚本名,比如S1_HTTP_HEADER") mode_group.add_argument("--all", action="store_true", help="运行指定类别下的所有脚本") # 通用参数 parser.add_argument("--url", required=True, help="目标URL") parser.add_argument("--port", type=int, required=True, help="目标端口") args = parser.parse_args()
3. 重构执行逻辑(核心部分)
用动态导入的方式批量处理脚本,不用一个个写if-elif判断,扩展性拉满:
def run_script(module_path, class_name, url, port): """通用脚本执行函数,动态导入类并执行""" # 动态导入模块 module = __import__(module_path, fromlist=[class_name]) # 获取类对象 ScriptClass = getattr(module, class_name) # 实例化并执行任务方法 instance = ScriptClass(url, port) instance.insert_value() # 先检查类别是否存在 if args.category not in CATEGORY_SCRIPTS: print(f"错误:不存在类别「{args.category}」") exit(1) current_category_scripts = CATEGORY_SCRIPTS[args.category] # 确定要运行的脚本列表 scripts_to_execute = [] if args.all: # 取当前类别下所有脚本的信息 scripts_to_execute = current_category_scripts.values() else: # 检查指定的脚本是否存在 if args.script not in current_category_scripts: print(f"错误:类别「{args.category}」下不存在脚本「{args.script}」") exit(1) scripts_to_execute = [current_category_scripts[args.script]] # 循环执行所有脚本 for script_info in scripts_to_execute: print(f"开始执行脚本:{script_info['class_name']}") run_script( script_info["module_path"], script_info["class_name"], args.url, args.port ) print(f"脚本「{script_info['class_name']}」执行完成\n")
关键细节说明
- 动态导入:用
__import__和getattr实现动态导入,避免了大量重复的from ... import ...代码,新增脚本时只需要更新CATEGORY_SCRIPTS字典。 - 接口一致性:要确保所有脚本的类都遵循相同的接口——接收
url和port作为构造参数,并且包含insert_value()方法,这样通用执行函数才能正常工作。 - 互斥参数:用
add_mutually_exclusive_group防止用户同时传入--script和--all,避免逻辑冲突。
测试验证
- 单个脚本运行(原有逻辑保持不变):
./main.py --category web --script S1_HTTP_HEADER --url https://qwerty.com --port 1234 - 批量运行所有脚本(新功能):
./main.py --category web --all --url https://qwerty.com --port 1234
这样就完美实现了你要的批量运行功能,后续新增脚本也只需要往映射字典里加条目,非常方便维护!
内容的提问来源于stack exchange,提问作者p0lux
相关产品推荐
相关产品推荐

