【问题标题】:Can argparse manage multiple sets of positional arguments?argparse 可以管理多组位置参数吗?
【发布时间】:2022-01-28 03:36:45
【问题描述】:

我想从命令行处理多组数据的输入,但我不知道该怎么做。我认为有多个可选参数和多个位置参数会起作用,但我不知道该怎么做。

例如,我想获取如下数据:

{
  'id': 23423423
  'host': 'hostname'
  'port': 234
}

我希望能够在命令行上输入多个集合。我该怎么做?

我的想法是有一个像这样的命令行:

python check.py -d 23423423 hostname.com 234 -d 22332322 hostname2.com 234

我一直在查看 argparse 以了解如何做到这一点,但如何做到这一点让我望而却步。

【问题讨论】:

  • 这能回答你的问题吗? Argparse, handle repeatable set of items
  • 我还建议,如果您需要传入结构化数据,那么传入 json(作为文件或命令行字符串)可能是更好的选择。
  • 我将其描述为多组optionals,标记参数。使用appendnargs=3,您将获得一个列表列表,您可以在解析后对其进行重组。
  • @hpaulj 这可能比我的回答更可取,它试图让arparse 自己处理构建dict
  • @match 不幸的是,关键是要使用数据创建一个 json 文件。如果 json 存在,则没有必要。我有些人难以正确构建数据。

标签: python argparse


【解决方案1】:

感觉它可以改进,但您可以定义一个自定义的 _AppendAction 子类来获取 3 个参数并使用它们构建一个 dict

import argparse
p = argparse.ArgumentParser()


class Config(argparse._AppendAction):
    def __call__(self, parser, namespace, values, option_string):
        id_ = int(values[0])
        port = int(values[2])
        d = {"id": id_, "host": values[1], "port": port}
        return super().__call__(parser, namespace, d, option_string)

p.add_argument("-d", nargs=3, action=Config, metavar=("ID", "HOST", "PORT"))

print(p.parse_args())

然后

$ python3 tmp.py -d 23423423 hostname.com 234 -d 22332322 hostname2.com 234
Namespace(d=[{'id': '23423423', 'host': 'hostname.com', 'port': 234}, {'id': '22332322', 'host': 'hostname2.com', 'port': 234}])

(我更喜欢类似的东西

def Config(t):
    return {"id": t[0], "host": t[1], "port": int(t[2])}

p.add_argument("-d", nargs=3, action='append', type=Config)

将 3 个参数聚合为单个对象的行为 与将结果 dict 附加到目的地是分开的, 但是每个单独的参数都单独传递给类型,而不是三个字符串作为单个元组传递。唉)

【讨论】:

  • 我喜欢这样加倍努力并给我听写。我不一定要那样做。这对我很有用。我唯一想知道的是是否可以修复帮助文本,所以它会说 -d id host port 而不是 -d d d d。
  • 是的,可以。我会更新的。
【解决方案2】:

可以如下进行。

import argparse
parser = argparse.ArgumentParser(description='')
parser.add_argument("-d", nargs="+", action='append')

args = parser.parse_args()
print(args.d)

运行python check.py -d 23423423 hostname.com 234 -d 22332322 hostname2.com 234 将被解析为如下列表。

[['23423423', 'hostname.com', '234'], ['22332322', 'hostname2.com', '234']]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 2011-05-27
    • 2023-04-02
    • 2012-02-15
    • 2018-02-20
    • 2019-04-13
    相关资源
    最近更新 更多