带有通用子解析器命令的 Python argparse

Posted

技术标签:

【中文标题】带有通用子解析器命令的 Python argparse【英文标题】:Python argparse with Generic Subparser Commands 【发布时间】: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 或文字星号*

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


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

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

【问题讨论】:

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

【讨论】:

以上是关于带有通用子解析器命令的 Python argparse的主要内容,如果未能解决你的问题,请参考以下文章

带有所需子解析器的 Argparse

如何从 Python 3 中的现有程序创建带有 argparse 的子解析器?

带有嵌套命名空间的 argparse 子命令

Python:正确处理子命令的全局选项的参数解析器

使用子解析器时,命令行参数被默认值覆盖

Python Argparse 子解析器