【问题标题】:How to execute multiple class instance in Python with Argparse如何使用 Argparse 在 Python 中执行多个类实例
【发布时间】:2020-08-13 13:38:23
【问题描述】:

我的项目有几个类别,里面有多个脚本,每个脚本都允许你执行一个独特的任务。

为了运行我的项目,我提供了我使用 argparse 检索的 main.py 参数。

示例:./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

其实我的 main.py 是这样的:

if args.category == "web":
    if args.script == 'S1_HTTP_HEADER':
        from scripts.WEB_S1_HTTPHEADER import RequestHeader
        make_request = RequestHeader(args.url, args.port)
        make_request.insert_value()

您是否有解决方案可以只使用一个参数一次运行所有脚本?

关于信息,每个脚本都有一个类,我必须用 URL 和 PORT 实例化它。当然,我必须在我的 main.py 中导入我的类,然后再进行操作。

谢谢!

【问题讨论】:

    标签: python python-3.x scripting


    【解决方案1】:

    我将定义一个自定义解析操作来加载与该类别相关的所有可调用对象。

    该类定义了一个绑定类别和相关可调用对象的映射。 每个可调用对象都是由脚本名称和关联的可调用对象组成的元组。 自定义操作创建了一个附加参数“脚本”作为列表对象。默认为空。

    导入机制也需要稍作改动。

    from scripts import WEB_S1_HTTPHEADER, WEB_S2_HTTPHEADER, WEB_S3_HTTPHEADER
    
    class GetScripts(argparse.Action):
        """
        """
        SCRIPTS = {"web": [("S1_HTTPHEADER", WEB_S1_HTTPHEADER.RequestHeader), ("S2_HTTPHEADER", WEB_S2_HTTPHEADER.RequestHeader), ("S3_HTTPHEADER", WEB_S3_HTTPHEADER.RequestHeader)]}
    
        def __init__(self, option_strings, dest, **kwargs):
            super(GetScripts, self).__init__(option_strings, dest, **kwargs)
    
        def __call__(self, parsobj, namespace, values, option_string=None):
            setattr(namespace, self.dest, values)
            if values:
                category = getattr(namespace, "category")
                setattr(namespace, "scripts", self.SCRIPTS.get(category, []))
    

    定义与自定义操作关联的关键字参数“--all”:

    your_parser.add_argument("--all", nargs="?", default=False, const=True, action=GetScripts)
    

    然后您可以遍历“脚本”参数以运行每个配置的可调用对象。

    main.py 现在看起来像:

    if args.all:
        for _, func in args.scripts:
            make_request = func(args.url, args.port)
            make_request.insert_value()
    

    新类别或新脚本意味着更改类成员 SCRIPTS。

    它是否满足您的需求?

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 2020-10-29
      相关资源
      最近更新 更多