You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:52:31