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

时间:2018-07-10 14:26:47

标签: python command-line-interface argparse

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

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

据我所知,argparse期望用户定义他期望的参数。

用argparse做到这一点的任何方法吗? 谢谢 !

2 个答案:

答案 0 :(得分:2)

如果您知道参数将始终以--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('-')

现在,您将在类ArgHolder(它是一个命名空间)中收集所有参数。您也可以在ArgHolder

的实例中收集值

答案 1 :(得分:0)

使用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)