【问题标题】:Python argparse with Generic Subparser Commands带有通用子解析器命令的 Python argparse
【发布时间】:2020-09-06 08:07:53
【问题描述】:

我有一个 python 脚本,我想将它用作另一个命令行工具的包装器。我想拦截我定义的任何子命令,但传递所有其他子命令和参数。我尝试过使用子解析器,这似乎很理想,但它似乎不允许接受通用的未定义命令,类似于 parse_known_args 对常规 ArgumentParser 所做的事情。

我目前拥有的:

ap = argparse.ArgumentParser()
subparsers = ap.add_subparsers(
    title="My Subparser",
)
upload_parser = subparsers.add_parser('upload', help='upload help')
upload_parser.add_argument(
    'path',
    help="Path to file for upload"
)
upload_parser.add_argument(
    '--recursive',
    '-r',
    action='store_true',
)

我想补充的:

generic_parser = subparser.add_parser('*', help='generic help') # "*" to indicate any other value
generic_parser.add_argument(
    'args',
    nargs='*',
    help='generic command arguments for passthru'
)

这不起作用,因为它只需要upload 或文字星号*

更准确地说,我希望有一个子命令,我只是事先不知道所有子命令将是什么(或者我真的不想列出我试图包装的工具的每个子命令)。


经过进一步思考,我意识到这种方法在某些方面对我的使用存在一定的缺陷,尽管我认为这个功能可能在其他地方有它的用途,所以我会留下这个问题。

就我而言,查看我的工具的帮助与它所包装的帮助之间存在冲突。也就是说,我无法区分用户是想查看包装器的帮助还是查看它所包装的工具的帮助。

【问题讨论】:

  • 不幸的是,如何 slurp 其余参数不是问题,如果没有给出子解析器命令,子解析器会抱怨。也就是说,在我的示例中,只有 myprog uploadmyprog * 可以接受,而我希望 myprog anything 可以接受。
  • 在某种程度上我想要一个可选的子解析器,但更准确地说我希望有一个子命令,我只是事先不知道所有子命令是什么(或者我真的不知道想列出我要包装的工具的每个子命令)。
  • argparse 旨在在给定无法识别的输入时引发错误。并为用户提供有关使用的具体帮助。如果您不需要/想要那种帮助或控制,请不要使用argparse。啜饮sys.argv 并以您想要的任何异国情调的方式处理它。

标签: python argparse subparsers


【解决方案1】:

我觉得你可以试试Click,这个真的很强大很好用!

看看这个例子

import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(count):
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()

【讨论】:

    猜你喜欢
    • 2017-01-31
    • 2013-02-27
    • 2018-12-31
    • 2014-06-14
    • 2020-01-14
    • 2012-05-13
    • 2013-08-19
    • 2020-10-24
    相关资源
    最近更新 更多