argparse 用于未知数量的参数和未知名称

argparse for unknown number of arguments and unknown names

我想获取所有传递给 sys.argv 且格式为
的参数 someprogram.py --someparameter 23 -p 42 -anotherparam somevalue.

我正在寻找的结果是一个包含所有变量的命名空间,已经解析。

据我了解,argparse 期望用户定义他期望的参数。

有什么方法可以用 argparse 做到这一点? 谢谢 !

如果您知道参数将始终以 --name value-name value 格式给出,您可以轻松做到

class ArgHolder(object):
    pass

name = None
for x in sys.argv[1:]:
    if name:
        setattr(ArgHolder, curname, x)
        name = None

    elif x.startswith('-'):
        name = x.lstrip('-')

现在您已经收集了 class ArgHolder 中的所有参数,这是一个命名空间。您还可以在 ArgHolder

的实例中收集值

使用Click我们可以构建这样一个命令:

import click

@click.command(help="Your description here")
@click.option("--someparameter", type=int, help="Description of someparameter")
@click.option("--p", type=int, help="Description of p")
@click.option("--anotherparam", type=str, help="Description of anotherparam")
def command(someparameter, p, anotherparam):
    pass


if __name__ == '__main__':
    command()

您将自动获得帮助选项:

$ python command.py --help
Usage: command.py [OPTIONS]

  Your description here.

Options:
  --someparameter INTEGER  Description of someparameter.
  ...
  --help           Show this message and exit.

如果您需要获取所有未知参数,您可以通过以下方式从上下文中获取它们:

@click.command(context_settings=dict(
     ignore_unknown_options=True,
     allow_extra_args=True,
 ), add_help_option=False)
@click.pass_context
def command(ctx):
    click.echo(ctx.args)